問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
Base b = new Sub();
b.method();
}
}
sealed class Base {
public void method() {
System.out.println("Base: ");
}
}
final class Sub extends Base {
private void print() {
System.out.print("Sub: ");
}
public void method() {
print();
}
}
選択肢
A)コンパイルエラーになる
B)ClassCastException がスローされる
C)Sub: が出力される
D)Base: Sub: が出力される
E)Sub: Base: が出力される
F)Base: が出力される
解答
A)コンパイルエラーになる
B)ClassCastException がスローされる
C)Sub: が出力される
D)Base: Sub: が出力される
E)Sub: Base: が出力される
F)Base: が出力される
解説
このコードを分析すると、次のようになります。
コードの流れ
1. メインメソッド
public static void main(String... args) {
Base b = new Sub();
b.method();
}
Base
型の変数 b
に Sub
クラスのインスタンスが代入されます。b.method();
が呼ばれると、Base
クラスの method
メソッドが呼ばれると思われがちですが、実際にはポリモーフィズムにより、Sub
クラスの method
メソッドが呼ばれます。
2. Baseクラス
sealed class Base {
public void method() {
System.out.println("Base: ");
}
}
Base
クラスには method
メソッドがありますが、Sub
クラスがこのメソッドをオーバーライドしています。
3. Subクラス
final class Sub extends Base {
private void print() {
System.out.print("Sub: ");
}
public void method() {
print();
}
}
Sub
クラスは Base
を継承しており、method
メソッドをオーバーライドしています。このメソッド内で print
メソッドを呼び出し、”Sub: ” を出力します。print
メソッドは private
ですが、method
メソッド内から呼び出せるため、問題ありません。
実行結果
- メインメソッドの
b.method();
が呼ばれると、Sub
クラスのmethod
メソッドが実行され、print();
が呼ばれます。 print
メソッドによって “Sub: ” が出力されます。
まとめ
- 出力: “Sub: “
- 選択肢の確認:
- A)コンパイルエラーになる → 不正解
- B)ClassCastException がスローされる → 不正解
- C)Sub: が出力される → 正解
- D)Base: Sub: が出力される → 不正解
- E)Sub: Base: が出力される → 不正解
- F)Base: が出力される → 不正解
最終的に、選択肢 C が正しい結果です。
対象資格:Java SE17 認定資格