【Java SE17 Silver 模擬試験】A-08

Java SE17 Silver 模擬試験
Java SE17 Silver 模擬試験

問題

次のコードをコンパイル、実行するとどうなりますか。

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
	}
}
  1. Base.hello():
    • Base クラスの name には "Duke" がセットされているため、出力は Hello: Duke になります。
  2. Sub.hello():
    • Sub クラスの name は静的変数として定義されていますが、初期化されていないため null になります。そのため、出力は Hello: null になります。
  3. Base.hello("Scott"):
    • Base クラスの hello(String name) メソッドが呼ばれ、引数の "Scott" が出力されるため、出力は Hello: Scott になります。
  4. 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 です。

前の問題へ SE17_A-07

次の問題へ SE17_A-09


対象資格:Java SE17 認定資格