Memorandums?

This blog is written about technical-discovery and daily-event.

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クラスのインスタンスを渡しても、
それは正しいということになるのです。