
問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
MyType t = new Base();
AbstractBase a = (AbstractBase) t;
Base b = (Base) t;
t.method();
a.method();
b.method();
}
}
interface MyType {
default void method() {
System.out.print("MyType::method ");
}
}
abstract sealed class AbstractBase implements MyType {
private void method() {
System.out.print("AbstractBase::method ");
}
}
final class Base extends AbstractBase {
public void method() {
System.out.print("Base::method ");
}
}
選択肢
A)Base::method MyType::method Base::method が出力される
B)ClassCastException がスローされる
C)Base::method Base::method Base::method が出力される
D)Base::method AbstractBase::method Base::method が出力される
E)コンパイルエラーになる
F)MyType::method AbstractBase::method Base::method が出力される
解答
A)Base::method MyType::method Base::method が出力される
B)ClassCastException がスローされる
C)Base::method Base::method Base::method が出力される
D)Base::method AbstractBase::method Base::method が出力される
E)コンパイルエラーになる
F)MyType::method AbstractBase::method Base::method が出力される
解説
このコードを実行すると、出力は C)Base::method Base::method Base::method になります。
- クラスの関係:
MyType
インターフェースにはデフォルトメソッドmethod()
が定義されています。AbstractBase
はMyType
を実装しているが、method()
メソッドはprivate
です。つまり、AbstractBase
の外からはこのメソッドにはアクセスできません。Base
クラスはAbstractBase
を拡張し、method()
をオーバーライドしています。
- main メソッド内の処理:
MyType t = new Base();
により、t
はBase
のインスタンスを指します。AbstractBase a = (AbstractBase) t;
およびBase b = (Base) t;
はキャストであり、問題なく動作します。t.method();
を呼び出すと、Base
のmethod()
が呼ばれ、Base::method
が出力されます。a.method();
もBase
のmethod()
を呼び出し、同様にBase::method
が出力されます。b.method();
も再びBase
のmethod()
が呼び出され、同じくBase::method
が出力されます。
対象資格:Java SE17 認定資格