![Java SE17 Silver 模擬試験](https://knowledgeblog-k.com/wp-content/uploads/2024/05/ad1254753efe45d88c9bd7f458025953.png)
問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
Person p1 = new Person();
AbstractPerson a1 = new Person();
Person p2 = new Person("Duke");
AbstractPerson a2 = new Person("Scott");
p1.print();
p2.print();
a1.print();
a2.print();
}
}
abstract class AbstractPerson {
String name;
AbstractPerson() {
this.name = "Ace";
}
AbstractPerson(String name) {
this.name = name;
}
public void print() {
System.out.print(" print:" + name);
}
abstract void print(String name);
}
class Person extends AbstractPerson {
String name;
Person() {
this.name = "King";
}
Person(String name) {
this.name = name;
}
public void print(String name) {
System.out.print(" print:" + name);
}
}
選択肢
A)print:null print:null print:Ace print:Ace が出力される
B)print:Ace print:Ace print:Ace print:Ace が出力される
C)NullPointerException がスローされる
D)コンパイルエラーになる
E)print: print: print:Ace print:Scott が出力される
F)print:King print:Duke print:Ace print:Scott が出力される
G)print:King print:Duke print:Ace print:Ace が出力される
解答
A)print:null print:null print:Ace print:Ace が出力される
B)print:Ace print:Ace print:Ace print:Ace が出力される
C)NullPointerException がスローされる
D)コンパイルエラーになる
E)print: print: print:Ace print:Scott が出力される
F)print:King print:Duke print:Ace print:Scott が出力される
G)print:King print:Duke print:Ace print:Ace が出力される
解説
コンストラクタの動作
Person p1 = new Person();
Person
のデフォルトコンストラクタが呼び出されます。この時、name
は"King"
に設定されますが、スーパークラスAbstractPerson
のコンストラクタも呼び出され、this.name
(スーパークラスのname
)が"Ace"
に設定されます。したがって、p1
のAbstractPerson
におけるname
は"Ace"
です。
AbstractPerson a1 = new Person();
- 同じように、
Person
のデフォルトコンストラクタが呼び出され、a1
のAbstractPerson
におけるname
も"Ace"
です。
- 同じように、
Person p2 = new Person("Duke");
- この場合、
name
は"Duke"
に設定されますが、AbstractPerson
のname
は変更されず、依然として"Ace"
です。
- この場合、
AbstractPerson a2 = new Person("Scott");
a2
に対しても同様の処理が行われ、name
は"Scott"
に設定されますが、スーパークラスのname
は"Ace"
です。
print メソッドの呼び出し
p1.print();
print
メソッドはAbstractPerson
から呼ばれます。ここでname
は"Ace"
なので、出力はprint:Ace
になります。
p2.print();
- 同様に、
p2
もAbstractPerson
のprint
メソッドを呼び出し、name
は"Ace"
です。したがって、出力はprint:Ace
になります。
- 同様に、
a1.print();
a1
も同様にAbstractPerson
のprint
メソッドを呼び出し、出力はprint:Ace
になります。
a2.print();
- 最後に、
a2
も同様にAbstractPerson
のprint
メソッドを呼び出し、出力はprint:Ace
になります。
- 最後に、
結論
最終的に、すべての print
呼び出しが AbstractPerson
の name
("Ace"
)を参照するため、出力は次のようになります:
print:Ace print:Ace print:Ace print:Ace
対象資格:Java SE17 認定資格