問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
Person p1 = new Person("Duke");
System.out.print(p1.name + ":" + p1.country + ",");
Person p2 = new Person("Scott");
System.out.print(p2.name + ":" + p2.country + ",");
p2.country = "US";
System.out.print(p1.name + ":" + p1.country + ",");
System.out.print(p2.name + ":" + p2.country + ",");
}
}
class Person {
public static String country;
public String name;
public Person(String name) {
this.name = name;
country = "JPN";
}
}
選択肢
A)Duke:JPN,Scott:JPN,Duke:JPN,Scott:US, が出力される
B)Sakila:JPN,Scott:JPN,Sakila:JPN,Scott:US, が出力される
C)Sakila:JPN,Scott:US,Sakila:JPN,Scott:US, が出力される
D)Duke:JPN,Scott:JPN,Duke:US,Scott:US, が出力される
E)Sakila:US,Scott:US,Sakila:US,Scott:US, が出力される
解答
A)Duke:JPN,Scott:JPN,Duke:JPN,Scott:US, が出力される
B)Sakila:JPN,Scott:JPN,Sakila:JPN,Scott:US, が出力される
C)Sakila:JPN,Scott:US,Sakila:JPN,Scott:US, が出力される
D)Duke:JPN,Scott:JPN,Duke:US,Scott:US, が出力される
E)Sakila:US,Scott:US,Sakila:US,Scott:US, が出力される
解説
実行の流れ
Person p1 = new Person("Duke");
p1
が作成され、コンストラクタが呼ばれます。this.name
に “Duke” が設定され、country
は “JPN” に設定されます。- 現在の状態:
p1.name
= “Duke”Person.country
= “JPN”
System.out.print(p1.name + ":" + p1.country + ",");
- 出力は
Duke:JPN,
になります。
- 出力は
Person p2 = new Person("Scott");
p2
が作成され、同様にコンストラクタが呼ばれます。this.name
に “Scott” が設定され、country
は再び “JPN” に設定されます(これは静的変数なので、全てのインスタンスで共通です)。- 現在の状態:
p1.name
= “Duke”p2.name
= “Scott”Person.country
= “JPN”
System.out.print(p2.name + ":" + p2.country + ",");
- 出力は
Scott:JPN,
になります。
- 出力は
p2.country = "US";
country
が “US” に変更されます。- 現在の状態:
p1.name
= “Duke”p2.name
= “Scott”Person.country
= “US”(両方のインスタンスが同じ静的変数を参照)
System.out.print(p1.name + ":" + p1.country + ",");
p1.country
は静的変数country
を参照するため、出力はDuke:US,
になります。
System.out.print(p2.name + ":" + p2.country + ",");
- 同様に、出力は
Scott:US,
になります。
- 同様に、出力は
最終的な出力
全体として、出力は以下のようになります:
Duke:JPN,Scott:JPN,Duke:US,Scott:US,
したがって、正しい選択肢は D)Duke,Scott,Duke,Scott, です。
対象資格:Java SE17 認定資格