スーパークラス型への代入

Revised: Jan./4th/2002: Since: Dec./30th/2001

前節で見た通り、同じクラス型変数間での代入は問題なく実行できます。異なるクラス型変数同士の代入は、基本的にはできません。但し、例外として、継承関係にあるクラス同士は代入できることがあります。

サブクラス型で定義された変数は、スーパークラス型で定義された変数に代入できます。サブクラスのオブジェクトはスーパークラスの定義に対応するインスタンスを持っているからです。この場合は明示的な型変換は必要ありません。

class SubstituteSub2SupDemo {
	public static void main(String[] args) {
		//サブクラスのインスタンス化
		Ko objKo=new Ko();
		//スーパークラス型変数へサブクラス型変数の代入
		Oya objOya = objKo;
		System.out.println("msgOya()");
		System.out.println("objOya: " + objOya.msgOya());
		System.out.println(" objKo: " + objKo.msgOya());
		System.out.println("msgKo()");
		// System.out.println("objOya: " + objOya.msgKo());
		System.out.println(" objKo: " + objKo.msgKo());
	}
}
class Oya {
	String msgOya() {
		return "Message from Oya.";
	}
}
class Ko extends Oya {
	String msgKo() {
		return "Message from Ko.";
	}
}

8行目で参照型変数間で参照先のコピーを行っています。 objOya はスーパークラス Oya 型の変数ですから、 Oya で定義された範囲しか利用できません。つまり、スーパークラス型変数 objOya に代入されたオブジェクトは、サブクラスで実装されている msgKo() は使えなくなります。

C:\Java>javac SubstituteSub2SupDemo.java
C:\Java>java SubstituteSub2SupDemo
msgOya()
objOya: Message from Oya.
 objKo: Message from Oya.
msgKo()
 objKo: Message from Ko.

コメントを外すと、コンパイルエラーになります。

オーバーライド

クラス型が異なっても、参照する実体が一つであることを、オーバーライドで確認します。

次のサンプルでは、 msg() メソッドがオーバーライドされています。クラス型によって、利用できるメソッドが変わるのですが、参照している実体であるインスタンスは一つである為、 msg() メソッドも一つです。サブクラスをインスタンス化したオブジェクトの msg() はサブクラスで実装されたものであって、スーパークラス型に型変換を受けてもそれは変わりません。

class SubToSupOverrideDemo {
	public static void main(String[] args) {
		//サブクラスのインスタンス化
		Ko objKo = new Ko();
		//スーパークラス型変数へサブクラス型変数の代入
		Oya objOya = objKo;
		System.out.println("objOya: " + objOya.msg());
		System.out.println(" objKo: " + objKo.msg());
	}
}
class Oya {
	//メソッド
	String msg() {
		return "Message from Oya.";
	}
}
class Ko extends Oya {
	//メソッドのオーバーライド
	String msg() {
		return "Message from Ko.";
	}
}

サブクラス Ko がインスタンス化されています。このインスタンスを参照する変数が、 Oya クラス型変数に代入されています。

また、継承によって msg() メソッドがオーバーライドされています。インスタンスは一つであり、これは Ko から作られていますから、 objOya からも objKo からも、 Ko で定義された msg() しか利用できないはずです。

C:\Java>javac SubToSupOverrideDemo.java
C:\Java>java SubToSupOverrideDemo
objOya: Message from Ko.
 objKo: Message from Ko.


Copyright © 2001 SUGAI, Manabu. All Rights Reserved.
SEO [PR] !uO z[y[WJ Cu