問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
Base.hello();
Sub.hello();
Base.hello("Scott");
Sub.hello("Sakila");
}
}
class Base {
static String name;
static {
name = "Duke";
}
public static void hello() {
System.out.print(" Hello: " + name);
}
public static void hello(String name) {
System.out.print(" Hello: " + name);
}
}
class Sub extends Base {
static String name;
public static void hello() {
System.out.print(" Hello: " + name);
}
}
選択肢
A)Hello: Hello: Hello: Scott Hello: Sakila が出力される
B)Hello: Duke Hello: null Hello: Scott Hello: Sakila が出力される
C)Hello: Duke Hello: Hello: Scott Hello: Sakila が出力される
D)NullPointerException がスローされる
E)コンパイルエラーになる
F)Hello: null Hello: null Hello: Scott Hello: Sakila が出力される
解答
A)Hello: Hello: Hello: Scott Hello: Sakila が出力される
B)Hello: Duke Hello: null Hello: Scott Hello: Sakila が出力される
C)Hello: Duke Hello: Hello: Scott Hello: Sakila が出力される
D)NullPointerException がスローされる
E)コンパイルエラーになる
F)Hello: null Hello: null Hello: Scott Hello: Sakila が出力される
解説
コードの処理順は以下のように処理されます。
public class Main {
public static void main(String... args) {
Base.hello(); //1-1. Baseクラスのhello()メソッド呼び出し 1-6.Hello: Duke
Sub.hello(); //2-1. 2-5.Hello: null
Base.hello("Scott"); //3-1. 3-4.Hello: Scott
Sub.hello("Sakila"); //4-1. 4-4.Hello:Sakila
}
}
class Base {
static String name; //1-4.
static {
name = "Duke"; //1-5. メンバ変数にDukeが入る
}
public static void hello() { //1-2.
System.out.print(" Hello: " + name); //1-3.Baseクラスの変数nameを取得
}
public static void hello(String name) { //3-2.
System.out.print(" Hello: " + name); //3-3.変数nameがScott
}
}
class Sub extends Base {
static String name; //null 2-4.
public static void hello() { //2-2. //4-2.
System.out.print(" Hello: " + name); //2-3. //4-3.変数nameがSakila
}
}
Base.hello()
:Base
クラスのname
には"Duke"
がセットされているため、出力はHello: Duke
になります。
Sub.hello()
:Sub
クラスのname
は静的変数として定義されていますが、初期化されていないためnull
になります。そのため、出力はHello: null
になります。
Base.hello("Scott")
:Base
クラスのhello(String name)
メソッドが呼ばれ、引数の"Scott"
が出力されるため、出力はHello: Scott
になります。
Sub.hello("Sakila")
:Sub
クラスには引数を取るhello
メソッドが定義されていないため、Base
クラスのhello(String name)
メソッドが呼ばれ、出力はHello: Sakila
になります。
最終的な出力は次の通りです:
Hello: Duke
Hello: null
Hello: Scott
Hello: Sakila
したがって、すべてを合わせると Hello: Duke Hello: null Hello: Scott Hello: Sakila
となります。正しい選択肢は B です。
対象資格:Java SE17 認定資格