DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

12章23

次の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メソッドが呼ばれる
    }
}
Enter fullscreen mode Exit fullscreen mode

ここで、各呼び出しに対応する出力を見てみましょう。

  1. a1.sample(list):

    • a1はクラスAのインスタンスです。
    • クラスAにはCollectionを引数に取るsampleメソッドがあります。
    • listListですが、ListCollectionのサブインターフェースなので、Asample(Collection arg)メソッドが呼び出され、"A"が表示されます。
    • 答えはA
  2. a2.sample(list):

    • a2はクラスBのインスタンスですが、型はAです。
    • クラスBにはCollectionを引数に取るsampleメソッドがオーバーライドされていますが、型がAなので、親クラスAsample(Collection arg)メソッドが呼ばれます。
    • したがって、a2.sample(list)Bのオーバーライドされたsample(Collection arg)メソッドを呼び出し、"B"が表示されます。
    • 答えはC
  3. b1.sample(list):

    • b1はクラスBのインスタンスです。
    • クラスBにはListを引数に取るsampleメソッドがオーバーロードされています。
    • listListなので、Bのオーバーロードされたsample(List arg)メソッドが呼び出され、"C"が表示されます。
    • 答えはE

これで、答えがA, C, Eである理由がわかります。

Top comments (0)