DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

12章35

このJavaコードでは、クラスABがあり、BAを継承しています。それぞれのクラスにprint()という同名のメソッドがありますが、これらのメソッドはprivateで宣言されているため、オーバーライドされません。その代わり、各クラスは自身のprint()メソッドを持っており、外部から直接アクセスすることはできません。

クラスApublic void a()メソッドは、Aprint()メソッドを呼び出して"A"を出力します。一方、クラスBpublic void b()メソッドはBprint()メソッドを呼び出して"B"を出力します。

メインメソッドでは、Bのオブジェクトを生成して、b.a()b.b()を呼び出しています。b.a()が呼ばれると、オブジェクトbの型(B)にかかわらず、Aa()メソッドが呼び出され、Aprint()メソッドが呼ばれ"A"が出力されます。b.b()が呼ばれると、Bb()メソッドが呼ばれ、Bprint()メソッドが呼ばれ"B"が出力されます。

したがって、メインメソッドが実行されると、まず"A"が出力され、次に"B"が出力されます。これが答えAが正しい理由です。

コメントを加えたコードを書き出して説明します:

public class A {
    private void print() { // Aクラスのprintメソッドはprivateなので、Aクラス内からのみアクセス可能
        System.out.println("A"); // "A"を出力する
    }
    public void a() { // Aクラスのpublicメソッドaは、クラス外からもアクセス可能
        print(); // Aクラスのprintメソッドを呼び出し、"A"を出力する
    }
}

public class B extends A {
    private void print() { // BクラスのprintメソッドはAのメソッドをオーバーライドしていない。Bクラス内からのみアクセス可能。
        System.out.println("B"); // "B"を出力する
    }
    public void b() { // Bクラスのpublicメソッドbは、クラス外からもアクセス可能
        print(); // Bクラスのprintメソッドを呼び出し、"B"を出力する
    }

    public static void main(String... args) {
        B b = new B(); // Bクラスのインスタンスを作成
        b.a(); // Aクラスのメソッドaを呼び出し、Aクラスのprintメソッドを実行するため"A"が出力される
        b.b(); // Bクラスのメソッドbを呼び出し、Bクラスのprintメソッドを実行するため"B"が出力される
    }
}
Enter fullscreen mode Exit fullscreen mode

このように、メインメソッドでは"A"が先に出力され、次に"B"が出力されるため、答えはAです。

 追記

AクラスとBクラスをprotectedまたはpublicで装飾するとオーバーライドが成立し、「B」「B」と表示されるようになる

Top comments (0)