継承したクラスのメソッドを、新しいメソッドで代替させる「オーバーライド」という仕組みを紹介します。
クラスを継承して、スーパークラスと同じ名前のメソッドを作ることを「オバーライド」と呼びます。
このオーバーライドしたメソッドは、先頭に「@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 ┃┗━━━━━━┛ ┃ ┗━━━━━━━━━━━━━━━━━┛