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.