Java クラス型の型変換とキャストのサンプル

クラス型の型変換とキャストのサンプルです。

目次

クラス型の型変換とキャスト

  • 型同士が継承または実装の関係である必要があります。
  • 子クラス型の変数を親クラス型の変数に代入する場合、暗黙的に型変換が行われます。→子クラスは親クラスのすべてのメンバーを保証できるため。
  • 親クラス型の変数を子クラス型の変数に代入する場合、明示的にダウンキャストを行う必要があります。→親クラスは子クラスのすべてのメンバーを保証できないため。

子クラス型の変数を親クラス型の変数に代入

子クラス型の変数を親クラス型の変数に代入するサンプルのコードです。

10行目のTestBクラスは、4行目のTestAクラスを継承しています。
18行目は、TestBクラスのインスタンスを生成しています。
 printA()は、実行可。(親クラスのメソッドを継承しているため)
 printB()は、実行可。
22行目は、子クラス型の変数を親クラス型の変数に代入しています。
型変換は暗黙的に行われます。
 printA()は、実行可。
 printB()は、実行不可。(ta1は親クラス型の変数のため実行できません)
 →変数の型で実行できるメソッドが制限されています。
package test1;

// 親クラス
class TestA {
	public void printA() {
		System.out.println("testA");
	}
}
// 子クラス (TestAクラスを継承)
class TestB extends TestA {
	public void printB() {
		System.out.println("testB");
	}
}
public class Test1 {
	public static void main(String[] args) {
 
		TestB tb1 = new TestB();
		tb1.printA();	//testA
		tb1.printB();	//testB
		
		TestA ta1 =  tb1;
		ta1.printA();	//testA
//		ta1.printB(); //コンパイルエラー
	}
}

親クラス型の変数を子クラス型の変数に代入

親クラス型の変数を子クラス型の変数に代入するサンプルのコードです。

10行目のTestBクラスは、4行目のTestAクラスを継承しています。
18行目は、TestBクラスのインスタンスを生成してTestAクラスの型に代入しています。
 printA()は、実行可。
 printB()は、実行不可。(ta2は親クラス型の変数のためTestBのメソッドを実行できません)
→変数の型で実行できるメソッドが制限されています。
22行目は、親クラス型の変数を子クラス型の変数に代入しています。
明示的にダウンキャストを行っています。ダウンキャストしない場合コンパイルエラーになります。
 printA()は、実行可。
 printB()は、実行可。
package test1;

// 親クラス
class TestA {
	public void printA() {
		System.out.println("testA");
	}
}
// 子クラス (TestAクラスを継承)
class TestB extends TestA {
	public void printB() {
		System.out.println("testB");
	}
}
public class Test1 {
	public static void main(String[] args) {
 				
		TestA ta2 =  new TestB();
		ta2.printA();	//testA
//		ta2.printB(); //コンパイルエラー
		
		TestB tb2 =  (TestB)ta2;
		tb2.printA();	//testA
		tb2.printB(); //testB
	}
}

(注釈1)子クラスにオーバーライドのメソッドがある場合

親クラス型の変数でオーバーライドのあるメソッドを実行するとオーバーライドした子クラスのメソッドが実行されます。

11行目のprintAメソッドは、5行目のprintAメソッドをオーバーライドしています。
24行目は、親クラス型の変数(ta1)ですが、TestBクラス(子クラス)のオーバーライドしたprintAメソッドを実行します。
package test1;

// 親クラス
class TestA {
	public void printA() {
		System.out.println("testA");
	}
}
// 子クラス (TestAクラスを継承)
class TestB extends TestA {
	public void printA() {
		System.out.println("testB-A");
	}
	public void printB() {
		System.out.println("testB");
	}
}
public class Test1 {
	public static void main(String[] args) {

		TestB tb1 = new TestB();

		TestA ta1 =  tb1;
		ta1.printA();	//testB-A
//		ta1.printB(); //コンパイルエラー
	}
}

(注釈2)子クラスから親クラスのメソッドを使う場合(super)

上記「子クラスにオーバーライドのメソッドがある場合」の続きです。
子クラスにオーバーライドのメソッドがある場合、子クラスのメソッドが呼ばれますが、superを使うと親クラスのメソッドを呼ぶとができます。

11行目のprintAメソッドは、5行目のprintAメソッドをオーバーライドしています。
12行目は、superを使用しています。親クラスのprintAメソッドを指定しています。
25行目は、親クラスと子クラスのprintAメソッドが実行されています。
package test1;

// 親クラス
class TestA {
	public void printA() {
		System.out.println("testA");
	}
}
// 子クラス (TestAクラスを継承)
class TestB extends TestA {
	public void printA() {
		super.printA();
		System.out.println("testBクラスのメソッド");
	}
	public void printB() {
		System.out.println("testB");
	}
}
public class Test1 {
	public static void main(String[] args) {

		TestB tb1 = new TestB();
 
		TestA ta1 =  tb1;
		ta1.printA();	//testA  testBクラスのメソッド が出力される
//		ta1.printB(); //コンパイルエラー
	}
}

関連の記事

Java クラスのサンプル
Java コンストラクタのサンプル
Java メンバー変数とローカル変数
Java instanceof演算子のサンプル
Java thisのサンプル
Java インターフェースのサンプル
Java abstract修飾子のサンプル
Java シングルトンのサンプル
Java ポリモフィズムのサンプル
Java staticメソッドとstatic変数のサンプル




△上に戻る