
問題
次のコードをコンパイル、実行するとどうなりますか。
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 認定資格
