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