クラスを継承した場合に、同じ名前のフィールドがあった場合は、上書きされず、独立して存在します。
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; ┗━━━━━━━━━━━━━━━━━┛