次の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)