このJavaコードでは、クラスAとBがあり、BはAを継承しています。それぞれのクラスにprint()という同名のメソッドがありますが、これらのメソッドはprivateで宣言されているため、オーバーライドされません。その代わり、各クラスは自身のprint()メソッドを持っており、外部から直接アクセスすることはできません。
クラスAのpublic void a()メソッドは、Aのprint()メソッドを呼び出して"A"を出力します。一方、クラスBのpublic void b()メソッドはBのprint()メソッドを呼び出して"B"を出力します。
メインメソッドでは、Bのオブジェクトを生成して、b.a()とb.b()を呼び出しています。b.a()が呼ばれると、オブジェクトbの型(B)にかかわらず、Aのa()メソッドが呼び出され、Aのprint()メソッドが呼ばれ"A"が出力されます。b.b()が呼ばれると、Bのb()メソッドが呼ばれ、Bのprint()メソッドが呼ばれ"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"が出力される
}
}
このように、メインメソッドでは"A"が先に出力され、次に"B"が出力されるため、答えはAです。
追記
AクラスとBクラスをprotectedまたはpublicで装飾するとオーバーライドが成立し、「B」「B」と表示されるようになる
Top comments (0)