継承関係にあるクラスの、どのフィールドやメソッドを指すかを指定する「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.フィールド名」「super.メソッド名」とすることで、スーパークラスのフィールドやメソッドが利用できます。
「this.フィールド名」「this.メソッド名」とすることで、自分のクラスのフィールドやメソッドが利用できます。
この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」と出力
また、それぞれのフィールドの参照先を図で示します。
┏SubClass━━━━━━━━━━━━━┓ ┃┏SuperClass━┓ ┃ ┃┃ ┃public ┃public ┃┃ ┠─○label "Super" ┠─○label "Sub" ┃┃ ┃ ↑ ┃ ┃┃ ┃ └─────────┐ ┃┃ ┃ ┃ │同じクラスの ┃┃ ┃ ┃ │labelを利用 ┃┃ ┃ ┃ │ ┃┃ ┠───────────○getLabel ┃┗━━━━━━┛ ┃ return label; ┗━━━━━━━━━━━━━━━━━┛
┏SubClass━━━━━━━━━━━━━┓ ┃┏SuperClass━┓ ┃ ┃┃ ┃public ┃public ┃┃ ┠─○label "Super" ┠─○label "Sub" ┃┃ ┃ ┃ ↑ ┃┃ ┃ ┃ │同じクラスの ┃┃ ┃ ┃ │labelを利用 ┃┃ ┃ ┃ │ ┃┃ ┃ ┠─○getLabel2 ┃┗━━━━━━┛ ┃ return label; ┗━━━━━━━━━━━━━━━━━┛
┏SubClass━━━━━━━━━━━━━┓ ┃┏SuperClass━┓ ┃ ┃┃ ┃public ┃public ┃┃ ┠─○label "Super" ┠─○label "Sub" ┃┃ ┃ ↑ ┃ ┃┃ ┃ └─────────┐ ┃┃ ┃ ┃ │スーパークラスの ┃┃ ┃ ┃ │labelを利用 ┃┃ ┃ ┃ │ ┃┃ ┃ ┠─○getSuperLabel ┃┗━━━━━━┛ ┃ return super.label; ┗━━━━━━━━━━━━━━━━━┛
┏SubClass━━━━━━━━━━━━━┓ ┃┏SuperClass━┓ ┃ ┃┃ ┃public ┃public ┃┃ ┠─○label "Super" ┠─○label "Sub" ┃┃ ┃ ┃ ↑ ┃┃ ┃ ┃ │自分のクラスの ┃┃ ┃ ┃ │labelを利用 ┃┃ ┃ ┃ │ ┃┃ ┃ ┠─○getThisLabel ┃┗━━━━━━┛ ┃ return this.label; ┗━━━━━━━━━━━━━━━━━┛