Java 親子クラス/インターフェース間の代入

Javaの親子クラス/インターフェース間の代入のサンプルです。

目次

サンプル 子クラスから親クラスの型への代入
  親クラスから子クラスの型への代入
  クラスからインターフェースの型への代入

子クラスから親クラスの型への代入

子クラスから親クラスの型の変数への代入は、暗黙的に型変換が行われるのでそのまま代入できます。

子クラスは親クラスのメンバーを保持しているためです。

package test1;

class TestA {
	void printA() {	}
}

class TestB extends TestA {
	void printB() {	}
}

public class Test1 {
	public static void main(String[] args) {
 
		TestB tb = new TestB(); //子クラスのデータ型に代入
		
		TestA ta =  tb; //親クラスのデータ型に代入
		ta.printA();
//		ta.printB(); //コンパイルエラー
	}
}

16行目は、親クラスの型の変数に代入しています。キャストなしで実行できます。
17行目は、親クラスのメソッドを実行しています。

変数の型で実行できるメソッドが制限

18行目は、子クラスのメソッドを実行しようとしていますがコンパイルエラーになります。
変数の型で実行できるメソッドが制限されています。
→継承でメソッド名が同じオーバーライドの場合は、インスタンスの型のほうで実行されます。
Java オーバーライドのサンプル

 

親クラスから子クラスの型への代入

親クラスから子クラスの型の変数への代入は、明示的にダウンキャストを行う必要があります。

親クラスは子クラスのすべてのメンバーを保持しているとは限らないためです。

package test1;

class TestA {
	void printA() {	}
}

class TestB extends TestA {
	void printB() {	}
}

public class Test1 {
	public static void main(String[] args) {
 				
		TestA ta =  new TestB(); //親クラスのデータ型に代入
		
		TestB tb =  (TestB)ta; //子クラスのデータ型に代入
		tb.printA();
		tb.printB(); 
	}
}

14行目は、子クラスのインスタンスを生成して親クラスのデータ型に代入しています。

ダウンキャスト

16行目は、子クラスの型の変数にダウンキャストを行って代入しています。ダウンキャストしない場合コンパイルエラーになります。キャストは、データ型をかっこで括ります。
17行目は、親クラスのメソッドを実行しています。
18行目は、子クラスのメソッドを実行しています。

 

クラスからインターフェースの型への代入

クラスからインターフェースの型の変数への代入は、暗黙的に型変換が行われるのでそのまま代入できます。

インターフェースを実装しているクラスはインターフェースのすべてのメンバーを保持しているためです。

package test1;

interface InterfaceA  {
	void printA();
}

class TestB implements InterfaceA  {
	public void printA() {	}
	public void printB() {	}
}

public class Test1 {
	public static void main(String[] args) {
 				
		TestB tb =  new TestB(); //クラスのデータ型に代入
		
		InterfaceA ia =  tb; //インターフェースのデータ型に代入
		ia.printA();
//		ia.printB(); //コンパイルエラー
	}
}

17行目は、インターフェース型の変数に代入しています。キャストなしで実行できます。
18行目は、インターフェースとクラスにあるメソッドを実行しています。

変数の型で実行できるメソッドが制限

19行目は、クラスのみにあるメソッドを実行しようとしていますがコンパイルエラーになります。
変数の型で実行できるメソッドが制限されています。

関連の記事

Java データ型とは(基本型と参照型)
Java クラスで使われる用語のまとめ(メンバー変数等)

△上に戻る