【クラスの継承】
*全てのクラスはObjectクラスを継承!(特に記述の必要なし)
・スーパークラス → 継承元のクラス
・サブクラス → 継承側のクラス
継承することで、自分自身で定義されたものの他に、スーパークラスのメソッドを実行したりメンバ変数を参照することが可能。
1 2 3 |
class サブクラス名 <span class="red">extends スーパークラス名</span>{ } |
<例:クラスBがクラスAを継承しクラスTopで呼出す>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class Top{ public static void main(String args[]){ B sample = new B(); System.out.println("サブクラスからのアクセス"); sample.getB(); System.out.println("他クラスからのアクセス"); System.out.println("値:" + sample.getA()); } } class A{ //protected修飾子→継承関係のサブクラスからなら直接参照可! protected int var = 0; protected int getA(){ return var; } } class B extends A{ public void getB(){ System.out.println("値:" + var); System.out.println("値:" + getA()); } } |
↓実行結果(今回はコンソール上に表示)
1 2 3 4 5 |
サブクラスからのアクセス 値:0 値:0 他のクラスからのアクセス 値:0 |
*サブクラスでコンストラクタの指定がない時
・スーパークラス側 → 自動的にスーパークラス側の引数がないコンストラクタを呼出す
<サブクラス内でスーパクラスのコンストラクタを指定>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class Top2{ public static void main(String args[]){ B sample = new B(); } } class A{ A(){ System.out.println("クラスAのコンストラクタ"); } A(int a){ System.out.println("クラスAの引数有りコンストラクタ"); } } class B extends A{ B(){ //スーパークラスの引数が(int型)のコンストラクタを呼出す <span class="red">super(5);</span> System.out.println("クラスBのコンストラクタ"); } } |
↓実行結果(今回はコンソール上に表示)
1 2 |
クラスAの引数有のコンストラクタ クラスBのコンストラクタ |
【メソッドのオーバーライド】
スーパークラスで定義したメソッドと同じものをサブクラスでも定義し、上書きすることができる!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class A{ public void car(){ System.out.println("自動車です"); } } class B extends A{ public void car(){ System.out.println("スポーツカーです"); } } class c extends A{ } |
↓実行結果(Bクラスのオブジェクトを作成時)
1 |
スポーツカーです |
↓実行結果(Cクラスのオブジェクトを作成時)
1 |
自動車です |
【継承したクラスのオブジェクトを扱う】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Top{ public static void main(String args[]){ //サブクラスのオブジェクト作成 <span class="red">sub</span> obj = new <span class="red">sub()</span>; } } class super{ public void name(){ System.out.println("未定義です"); } } class sub extends super{ public void name(){ System.out.println("商品名はoooです"); } public void version(){ System.out.println("バージョン1.0です"); } } |
*スーパークラスの変数に対してサブクラスのオブジェクトを割り当てれる(スーパークラスのオブジェクトでもOK)
1 |
スーパークラス 変数名 = new サブクラス(); |
スーパークラスの変数にサブクラスのオブジェクトを格納
→このオブジェクトではスーパークラスで定義されているメソッドだけ実行可。
(サブクラスでオーバーライドしている場合は、サブクラスのメソッドを呼出す。)
*オーバーライド処理はオブジェクトを作成したクラスが優先!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Top{ public static void main(String args[]){ //サブクラスのオブジェクト作成 <span class="red">super</span> obj = new <span class="red">sub()</span>; obj.name(); } } class super{ public void name(){ System.out.println("未定義です"); } } class sub extends super{ public void name(){ System.out.println("商品名はoooです"); } public void version(){ System.out.println("バージョン1.0です"); } } |
↓実行結果(スーパクラスで定義してるメソッドだけ実行*今回はオーバーライドしているのでサブクラスで指定した内容表示)
1 |
商品名はoooです |
obj[] = new subA();
【スーパークラスの変数を使用しサブクラスのオブジェクトを配列に格納】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
class Top{ public static void main(String args[]){ //スーパクラスのオブジェクト作成 <span class="red">super</span> obj[] = new <span class="red">super[3]</span>; obj[0] = new subA(); obj[1] = new subB(); obj[2] = new subC(); } } class super{ public void name(){ System.out.println("未定義です"); } } class subA extends super{ public void name(){ System.out.println("商品名はoooです"); } } class subB extends super{ public void name(){ System.out.println("商品名は△△△です"); } } class subC extends super{ public void name(){ System.out.println("商品名は×××です"); } } |
↓実行結果
1 2 3 |
商品名はoooです 商品名は△△△です 商品名は×××です |
【修飾子:final】
他のクラスからの継承を禁止
1 2 |
final class クラス名{ } |
オーバーライドを禁止
1 2 |
public final void メソッド名{ } |
値の代入を禁止(フィールドに指定)
1 |
protected final データ型 変数名; |
定数(初期値の設定)
1 |
public static final データ型 変数名(大文字:スネイク型) = 初期値; |
【equals()メソッド】
左辺と右辺の値が一致するかの判断
戻り値:boolean型、
左辺と右辺の値が一致 → 「true」 を返す
<例1:オブジェクトの参照先情報が同じかを判断>
1 |
Aオブジェクトの変数名.equals(Bオブジェクトの変数名); |
<例2:文字列が同じかを判断>
1 2 3 4 5 6 7 |
String str = "こんにちは"; if(str.equals("こんにちは")){ 処理1を実行; }else{ 処理2を実行; } |