【Java SE17 Silver 模擬試験】B-26

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

問題

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

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 が出力される

解説

コンストラクタの動作

  1. Person p1 = new Person();
    • Personのデフォルトコンストラクタが呼び出されます。この時、name"King" に設定されますが、スーパークラス AbstractPerson のコンストラクタも呼び出され、this.name(スーパークラスの name)が "Ace" に設定されます。したがって、p1AbstractPerson における name"Ace" です。
  2. AbstractPerson a1 = new Person();
    • 同じように、Personのデフォルトコンストラクタが呼び出され、a1AbstractPerson における name"Ace" です。
  3. Person p2 = new Person("Duke");
    • この場合、name"Duke" に設定されますが、AbstractPersonname は変更されず、依然として "Ace" です。
  4. AbstractPerson a2 = new Person("Scott");
    • a2 に対しても同様の処理が行われ、name"Scott" に設定されますが、スーパークラスの name"Ace" です。

print メソッドの呼び出し

  • p1.print();
    • print メソッドは AbstractPerson から呼ばれます。ここで name"Ace" なので、出力は print:Ace になります。
  • p2.print();
    • 同様に、p2AbstractPersonprint メソッドを呼び出し、name"Ace" です。したがって、出力は print:Ace になります。
  • a1.print();
    • a1 も同様に AbstractPersonprint メソッドを呼び出し、出力は print:Ace になります。
  • a2.print();
    • 最後に、a2 も同様に AbstractPersonprint メソッドを呼び出し、出力は print:Ace になります。

結論

最終的に、すべての print 呼び出しが AbstractPersonname"Ace")を参照するため、出力は次のようになります:

print:Ace print:Ace print:Ace print:Ace

前の問題へ SE17_B-25

次の問題へ SE17_B-27

対象資格:Java SE17 認定資格