マンガで分かる Java入門講座

第9章 クラスとオブジェクト2
9-3. 継承2 superとthis

継承関係にあるクラスの、どのフィールドやメソッドを指すかを指定する「super」と「this」を紹介します。

● スーパークラスとサブクラスの関係

 クラスを継承した場合に、同じ名前のフィールドがあった場合は、上書きされず、独立して存在します。

ソースコード)スーパークラス
package sample;

public class SuperClass {
    public String label = "Super";
}

ソースコード)サブクラス
package sample;

public class SubClass extends SuperClass {
    public String label = "Sub";
}

図)スーパークラスとサブクラスの関係
┏SubClass━━━━━━━━━━━━━┓
┃┏SuperClass━┓         ┃
┃┃      ┃public      ┃public
┃┃      ┠─○label "Super" ┠─○label "Sub"
┃┗━━━━━━┛         ┃
┗━━━━━━━━━━━━━━━━━┛

 ただし、クラスの外から見えるのは、サブクラスのフィールドになります。

ソースコード)外からの見え方
SubClass subClass = new SubClass();
System.out.println(subClass.label);  // 「Sub」と出力

● superとthis

 サブクラスには、スーパークラスのフィールドやメソッドと、サブクラスのフィールドやメソッドが存在します。

 これらをプログラム内で区別したい場合は「super」と「this」の予約語を利用します。

 「super.フィールド名」「super.メソッド名」とすることで、スーパークラスのフィールドやメソッドが利用できます。

 「this.フィールド名」「this.メソッド名」とすることで、自分のクラスのフィールドやメソッドが利用できます。

 このthisは省略しても構いません。「フィールド名」「メソッド名」とすれば、それだけで自分のクラスのフィールドやメソッドを指します。


● superとthisの実例

 実際に、superとthisを使ったプログラムを示します。

ソースコード)スーパークラス
package sample;

public class SuperClass {
    public String label = "Super";

    public String getLabel() {
        return label;
    }
}

ソースコード)サブクラス
package sample;

public class SubClass extends SuperClass {
    public String label = "Sub";

    public String getLabel2() {
        return label;
    }

    public String getSuperLabel() {
        return super.label;
    }

    public String getThisLabel() {
        return this.label;
    }
}

ソースコード)サブクラスの利用
SubClass subC = new SubClass();
System.out.println(subC.getLabel());       // 「Super」と出力
System.out.println(subC.getLabel2());      // 「Sub」と出力
System.out.println(subC.getSuperLabel());  // 「Super」と出力
System.out.println(subC.getThisLabel());   // 「Sub」と出力

 また、それぞれのフィールドの参照先を図で示します。

図)getLabel
┏SubClass━━━━━━━━━━━━━┓
┃┏SuperClass━┓         ┃
┃┃      ┃public      ┃public
┃┃      ┠─○label "Super" ┠─○label "Sub"
┃┃      ┃   ↑     ┃
┃┃      ┃   └─────────┐
┃┃      ┃         ┃   │同じクラスの
┃┃      ┃         ┃   │labelを利用
┃┃      ┃         ┃   │
┃┃      ┠───────────○getLabel
┃┗━━━━━━┛         ┃   return label;
┗━━━━━━━━━━━━━━━━━┛

図)getLabel2
┏SubClass━━━━━━━━━━━━━┓
┃┏SuperClass━┓         ┃
┃┃      ┃public      ┃public
┃┃      ┠─○label "Super" ┠─○label "Sub"
┃┃      ┃         ┃   ↑
┃┃      ┃         ┃   │同じクラスの
┃┃      ┃         ┃   │labelを利用
┃┃      ┃         ┃   │
┃┃      ┃         ┠─○getLabel2
┃┗━━━━━━┛         ┃   return label;
┗━━━━━━━━━━━━━━━━━┛

図)getSuperLabel
┏SubClass━━━━━━━━━━━━━┓
┃┏SuperClass━┓         ┃
┃┃      ┃public      ┃public
┃┃      ┠─○label "Super" ┠─○label "Sub"
┃┃      ┃   ↑     ┃
┃┃      ┃   └─────────┐
┃┃      ┃         ┃   │スーパークラスの
┃┃      ┃         ┃   │labelを利用
┃┃      ┃         ┃   │
┃┃      ┃         ┠─○getSuperLabel
┃┗━━━━━━┛         ┃   return super.label;
┗━━━━━━━━━━━━━━━━━┛

図)getThisLabel
┏SubClass━━━━━━━━━━━━━┓
┃┏SuperClass━┓         ┃
┃┃      ┃public      ┃public
┃┃      ┠─○label "Super" ┠─○label "Sub"
┃┃      ┃         ┃   ↑
┃┃      ┃         ┃   │自分のクラスの
┃┃      ┃         ┃   │labelを利用
┃┃      ┃         ┃   │
┃┃      ┃         ┠─○getThisLabel
┃┗━━━━━━┛         ┃   return this.label;
┗━━━━━━━━━━━━━━━━━┛

この講座のマンガ部分は「箱人形マンガ(Box Comic) 」で作成しています。
作成:2013/06/02  更新:2015/08/09  [Permalink]