Javaのオーバーライドのサンプルです。
目次
サンプル | オーバーライドとは |
オーバーライドのサンプル | |
子クラスから親クラスのインスタンスを参照する(super) | |
オーバーライドの禁止(final) | |
変数の型とインスタンスの型の注意点 |
オーバーライドとは
オーバーライドとは、親クラスのメソッド名と子クラスのメソッド名が同じ時は子クラスのメソッドが実行されることです。(引数の型と数と並び順、戻り値の型含む)
クラスを継承したときに使用できます。
似た名前として、オーバーロードがありますがそれとは別物です。
Java オーバーロードのサンプル
オーバーライドのサンプル
package test1;
class Color1 {
String getName1() {
return "赤";
}
}
class Color2 extends Color1{
@Override
String getName1() {
return "青";
}
}
public class Test1 {
public static void main(String[] args) {
Color2 c2 = new Color2();
System.out.println(c2.getName1()); //青
}
}
3~7行目は親クラスです。
8~13行目は子クラスです。
10行目がオーバーライドです。4行目とメソッド名が同じで引数も同じ(なし)です。
18行目のメソッドの実行は、オーバーライドのため4行目の親クラスのメソッドではなく、10行目の子クラスのメソッドが実行されます。
9行目はオーバーライドであることを示すアノテーションです。
このアノテーションがある場合、オーバーライドになっていないとエラーになります。
子クラスから親クラスのインスタンスを参照する(super)
superを使用してオーバーライドした子クラスのメソッドから親クラスのメソッドを呼びます。
package test1;
class Color1 {
String getName1() {
return "赤";
}
}
class Color2 extends Color1{
@Override
String getName1() {
System.out.println(super.getName1());
return "青";
}
}
public class Test1 {
public static void main(String[] args) {
Color2 c2 = new Color2();
System.out.println(c2.getName1()); //赤 青
}
}
10行目は、4行目のメソッドをオーバーライドしています。
11行目は、superを使用して親クラスのメソッドを呼んでいます。
19行目は、親クラスと子クラスのメソッドの実行結果が表示されます。
オーバーライドの禁止(final)
メソッドの前にfinalをつけるとオーバーライドが禁止されます。
package test1;
class Color1 {
final String getName1() {
return "赤";
}
}
class Color2 extends Color1{
// @Override
// String getName1() {
// return "青";
// }
}
public class Test1 {
public static void main(String[] args) {
Color2 c2 = new Color2();
System.out.println(c2.getName1()); //
}
}
10行目は、4行目のメソッドをオーバーライドしようとしていますが、4行目のメソッドの前にfinalがついているので不可です。コンパイルエラーになります。
変数の型とインスタンスの型の注意点
package test1;
class Color1 {
String getName1() {
return "赤";
}
}
class Color2 extends Color1{
@Override
String getName1() {
return "青";
}
}
public class Test1 {
public static void main(String[] args) {
Color1 c1 = new Color2();
System.out.println(c1.getName1()); //青
}
}
17行目は、子クラスをインスタンス化していますが、変数の型は親クラスのColor1です。
18行目で実行されるメソッドは、10行目の子クラスのメソッドです。
変数の型ではなくインスタンスの型で実行されるので注意が必要です。
これはメソッドがオーバーライドの場合です。
オーバーライドでない場合、実行できるメソッドは代入する変数の型に制限されます。
Java 親子クラス/インターフェースの代入(キャスト)
関連の記事
Java入門 クラスの仕組みとサンプル
Java コンストラクタのサンプル
Java クラスの継承の仕組みとサンプル
Java オーバーロードのサンプル