javaの疑問を解消しよう part1
問題。
public class C { public static void main(String[] args) { new B(new A()); } } class B { B(C c) { } } class A extends C { }
このソースコードは正しいですか?
答え。
正しいです。(もちろんこのソースコードに意味はありません)
Cクラスでは、メインメソッドで、Bクラスのインスタンスを作成しています。
Bクラスのコンストラクタでは、第一引数にCのインスタンスを与えなくてはならないと定義しています。
それなのに、CクラスでのBクラスのインスタンス生成時に、
引数として、Aのインスタンスを渡してしまっています。
これは一見間違いだと思いがちなのですが、
Aクラスのコードを見てください。
Aクラスは、Cクラスを継承しています。
継承しているということは、Cクラスの機能を包括しているということなので、
Aクラスは、Cクラスの代用もできる、
ということになります。
したがって、引数として、Aクラスのインスタンスを渡しても、
それは正しいということになるのです。