次のJavaのコードについて説明し、答えがA, C, Eである理由を示します。
import java.util.Collection;
// クラスAの定義
public class A {
public void sample(Collection arg) {
System.out.println("A");
}
}
import java.util.Collection;
import java.util.List;
// クラスBの定義、クラスAを継承
public class B extends A {
// Collectionを引数に取るsampleメソッドをオーバーライド
public void sample(Collection arg) {
System.out.println("B");
}
// Listを引数に取るsampleメソッドをオーバーロード
public void sample(List arg) {
System.out.println("C");
}
}
import java.util.ArrayList;
import java.util.List;
// Mainクラスの定義
public class Main {
public static void main(String[] args) {
A a1 = new A(); // クラスAのインスタンス
A a2 = new B(); // クラスBのインスタンスだが、型はA
B b1 = new B(); // クラスBのインスタンス
List<String> list = new ArrayList<>();
// 各sampleメソッドの呼び出し
a1.sample(list); // Aのsampleメソッドが呼び出される
a2.sample(list); // Bのsampleメソッドが呼び出されるが、引数はListなので、オーバーロードされていない親クラスのメソッドが呼ばれる
b1.sample(list); // Bのオーバーロードされたsampleメソッドが呼ばれる
}
}
ここで、各呼び出しに対応する出力を見てみましょう。
-
a1.sample(list)
:-
a1
はクラスA
のインスタンスです。 - クラス
A
にはCollection
を引数に取るsample
メソッドがあります。 -
list
はList
ですが、List
はCollection
のサブインターフェースなので、A
のsample(Collection arg)
メソッドが呼び出され、"A"が表示されます。 - 答えはA。
-
-
a2.sample(list)
:-
a2
はクラスB
のインスタンスですが、型はA
です。 - クラス
B
にはCollection
を引数に取るsample
メソッドがオーバーライドされていますが、型がA
なので、親クラスA
のsample(Collection arg)
メソッドが呼ばれます。 - したがって、
a2.sample(list)
はB
のオーバーライドされたsample(Collection arg)
メソッドを呼び出し、"B"が表示されます。 - 答えはC。
-
-
b1.sample(list)
:-
b1
はクラスB
のインスタンスです。 - クラス
B
にはList
を引数に取るsample
メソッドがオーバーロードされています。 -
list
はList
なので、B
のオーバーロードされたsample(List arg)
メソッドが呼び出され、"C"が表示されます。 - 答えはE。
-
これで、答えがA, C, Eである理由がわかります。
Top comments (0)