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

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

目次

オーバーライド

  • クラスを継承したときに使用できます。
  • 親クラスで定義したメソッドを、子クラスで同じメソッド名を記述して処理内容を上書きすることです。
  • オーバーライドするメソッドは、メソッド名、引数、戻り値の型が同じである必要があります。
  • 似た名前として、オーバーロードがありますがそれとは別物です。
    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 オーバーロードのサンプル

△上に戻る