問題
次のコードをコンバイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
Hello hello = new HelloImp1();
hello.greeting();
}
}
interface Hello {
default void greeting() { System.out.println("Hello World");}
}
abstract class AbstractHello {
private void greeting() { System.out.println("Abstract Hello World");}
}
class HelloImp1 extends AbstractHello implements Hello {}
選択肢
A)コンパイルエラーになる
B)Hello World が出力される
C)Abstract Hello World が出力される
D)ClassCastException がスローされる
E)何も出力されない
解答
A)コンパイルエラーになる
B)Hello World が出力される
C)Abstract Hello World が出力される
D)ClassCastException がスローされる
E)何も出力されない
解説
以下の順にコード処理が行われます。
public class Main {
public static void main(String... args) {
Hello hello = new HelloImp1(); //1
hello.greeting(); //2
}
}
interface Hello {
default void greeting() { System.out.println("Hello World");} //3. Hello Worldが出力
}
abstract class AbstractHello {
private void greeting() { System.out.println("Abstract Hello World");}
}
class HelloImp1 extends AbstractHello implements Hello {}
なお、AbstractHelloクラスのgreeting()メソッドのアクセス修飾子はprivateのため、AbstractHelloクラス内でしか利用できません。HelloImp1
クラスは Hello
インターフェースを実装しており、デフォルトメソッド greeting()
を持っています。
AbstractHello
クラスには private
な greeting()
メソッドがありますが、private
メソッドはそのクラスの外部からはアクセスできません。このため、HelloImp1
クラスからはこの greeting()
メソッドは見えず、使用されることはありません。
Main
クラスの main
メソッドでは HelloImp1
のインスタンスを作成し、その greeting()
メソッドを呼び出しています。この場合、Hello
インターフェースのデフォルトメソッドが呼び出されるため、出力は Hello World
になります。
そのため、Hello Worldが出力されます。
A)コンパイルエラーになる
→ 誤り。コードは正しくコンパイルされます。すべてのクラスとインターフェースが正しく実装されています。
B)Hello World が出力される
→ 正しい。Hello
インターフェースのデフォルトメソッドが呼び出されるため、出力は Hello World
になります。
C)Abstract Hello World が出力される
→ 誤り。AbstractHello
クラスの greeting()
メソッドは private
であり、HelloImp1
からはアクセスできないため、出力されることはありません。
D)ClassCastException がスローされる
→ 誤り。HelloImp1
のインスタンスは Hello
として扱われますが、キャストに関するエラーは発生しません。
E)何も出力されない
→ 誤り。hello.greeting()
が呼び出されているため、出力が行われます。
対象資格:Java SE17 認定資格