Java オーバーライドのサンプル

目次

サンプル オーバーライドとは
  子クラスから親クラスのインスタンスを参照する(super)
  オーバーライドの禁止(final)
  変数の型とインスタンスの型の注意点

オーバーライドとは

・オーバーライドとは、親クラスと子クラスのメソッド名が同じ時は子クラスのメソッドが実行されることです。(引数の型と数と並び順、戻り値の型含む)

・クラスを継承したときに使用できます。

・似た名前として、オーバーロードがありますがそれとは別物です。
Java オーバーロードのサンプル

 

オーバーロードのサンプル

3行目は親クラスで、8行目は子クラスです。

package test1;

class Color1 {
	String getName1() {
		return "red";
	}
}
class Color2 extends Color1{
	@Override
	String getName1() {
		return "blue";
	}
}
public class Test1 {
	public static void main(String[] args) {
				
		Color2 c2 = new Color2();		
		System.out.println(c2.getName1()); // blue
	}
}

10行目がオーバーライドです。4行目とメソッド名が同じで引数も同じ(なし)です。

18行目のメソッドの実行は、オーバーライドのため4行目の親クラスのメソッドではなく、10行目の子クラスのメソッドが実行されます。
9行目はオーバーライドであることを示すアノテーションです。
このアノテーションがある場合、オーバーライドになっていないとエラーになります。

 

子クラスから親クラスのインスタンスを参照する(super)

3行目は親クラスで、8行目は子クラスです。

package test1;

class Color1 {
	String getName1() {
		return "red";
	}
}
class Color2 extends Color1{
	@Override
	String getName1() {
		System.out.println(super.getName1());
		return "blue";
	}
}
public class Test1 {
	public static void main(String[] args) {
				
		Color2 c2 = new Color2();		
		System.out.println(c2.getName1()); //red blue
	}
}

10行目は、4行目のメソッドをオーバーライドしています。
11行目は、superを使用して親クラスのメソッドを呼んでいます。
19行目は、親クラスと子クラスのメソッドの実行結果が表示されます。

point

superを使用するとオーバーライドした子クラスのメソッドから親クラスのメソッドを呼べます。

 

オーバーライドの禁止(final)

3行目は親クラスで、8行目は子クラスです。

package test1;

class Color1 {
	final String getName1() {
		return "red";
	}
}
class Color2 extends Color1{
//	@Override
//	String getName1() {
//		return "blue";
//	}
}
public class Test1 {
	public static void main(String[] args) {
				
		Color2 c2 = new Color2();		
		System.out.println(c2.getName1()); //
	}
}

4行目のメソッドの前にfinalがあります。
10行目は、4行目のメソッドをオーバーライドしようとしていますが、4行目のメソッドの前にfinalがついているので不可です。コンパイルエラーになります。

point

メソッドの前にfinalをつけるとオーバーライドが禁止されます。

 

変数の型とインスタンスの型の注意点

3行目は親クラスで、8行目は子クラスです。

package test1;

class Color1 {
	String getName1() {
		return "red";
	}
}
class Color2 extends Color1{
	@Override
	String getName1() {
		return "blue";
	}
}
public class Test1 {
	public static void main(String[] args) {
				
		Color1 c1 = new Color2();		
		System.out.println(c1.getName1()); // blue
	}
}

17行目は、子クラスをインスタンス化していますが、変数の型は親クラスのColor1です。
18行目で実行されるメソッドは、10行目の子クラスのメソッドです。

point

変数の型ではなくインスタンスの型で実行されるので注意が必要です。

これはメソッドがオーバーライドの場合です。
オーバーライドでない場合、実行できるメソッドは代入する変数の型に制限されます。
Java 親子クラス/インターフェースの代入(キャスト)

関連の記事

Java コンストラクタのサンプル
Java オーバーロードのサンプル

△上に戻る