クラスを継承して、スーパークラスと同じ名前のメソッドを作ることを「オバーライド」と呼びます。
このオーバーライドしたメソッドは、先頭に「@Override」という「アノテーション(注釈)」を付けます。
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";
@Override
public String getLabel() {
return label;
}
}
package sample; public class Sample { public static void main(String[] args) { SubClass subClass = new SubClass(); System.out.println(subClass.getLabel()); // 「Sub」と出力 } }
スーパークラスのメソッドを使う場合は「super.メソッド名」と書きます。
String s = super.getLabel();
スーパークラスのコンストラクタを使う場合は「super( )」と書きます。このsuper( )は、サブクラスのコンストラクタの1行目に書かなければなりません。
そのためサブクラスのコンストラクタでは、スーパークラスの初期化が終わった上で+αの初期化を行うことになります。
public SubClass() {
super();
System.out.println("SubClas");
}
スーパークラスのメソッドAを、スーパークラスのメソッドBが使っていたとします。このメソッドAが、サブクラスでオーバーライドされた場合は、メソッドBはサブクラスのメソッドAを使うことになります。
以下、その挙動が分かるサンプルを示します。
package sample; public class SuperClass { public String label = "Super"; public String getLabel() { return "Super : " + label; } public String getLabel2() { return getLabel(); } }
package sample; public class SubClass extends SuperClass { public String label = "Sub"; @Override public String getLabel() { return "Sub : " + label; } }
package sample; public class Sample { public static void main(String[] args) { SubClass subClass = new SubClass(); System.out.println(subClass.getLabel2()); // 「Sub : Sub」と出力 } }
┏SubClass━━━━━━━━━━━━━┓ ┃┏SuperClass━┓ ┃ ┃┃ ┃ ┃@Override ┃┃ ┠─×getLabel ┠─○getLabel ┃┃ ┃ ┃ ↑ ┃┃ ┃ ┃ │ ┃┃ ┃ ┃ │ ┃┃ ┃ ┃ │ ┃┃ ┠───────────○getLabel2 ┃┗━━━━━━┛ ┃ ┗━━━━━━━━━━━━━━━━━┛