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

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

問題

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

public class Main {
	public static void main(String... args) {
		Base b = new Sub();
		System.out.print("Base.id=" + b.id + ",Base::getID=" + b.getId() + " | ");
		b.id = 20;
		System.out.print("Base.id=" + b.id + ",Base::getID=" + b.getId() + " | ");
		Sub s = (Sub) b;
		System.out.print("Base.id=" + b.id + ",Base::getID=" + b.getId() + " | ");
		s.id = 21;
		System.out.print("Base.id=" + b.id + ",Base::getID=" + b.getId() + " | ");
	}
}

class Base {
	public int id = 10;

	public int getId() {
		return id;
	}
}

class Sub extends Base {
	int id = 11;

	public int getId() {
		return id;
	}
}

選択肢

A) Base.id=10,Base::getID=11 | Base.id=20,Base::getID=20 | Sub.id=11,Sub::getID=11 | Sub.id=21,Sub::getID=21 |  が出力される
B) Base.id=10,Base::getID=11 | Base.id=10,Base::getID=11 | Sub.id=20,Sub::getID=11 | Sub.id=21,Sub::getID=21 |  が出力される
C) Base.id=10,Base::getID=10 | Base.id=10,Base::getID=10 | Sub.id=20,Sub::getID=20 | Sub.id=21,Sub::getID=21 |  が出力される
D) Base.id=10,Base::getID=11 | Base.id=20,Base::getID=11 | Sub.id=11,Sub::getID=11 | Sub.id=21,Sub::getID=21 |  が出力される
E) Base.id=10,Base::getID=10 | Base.id=10,Base::getID=20 | Sub.id=20,Sub::getID=20 | Sub.id=21,Sub::getID=21 |  が出力される
F) Base.id=10,Base::getID=10 | Base.id=20,Base::getID=20 | Sub.id=11,Sub::getID=11 | Sub.id=21,Sub::getID=21 |  が出力される

解答

A) Base.id=10,Base::getID=11 | Base.id=20,Base::getID=20 | Sub.id=11,Sub::getID=11 | Sub.id=21,Sub::getID=21 |  が出力される
B) Base.id=10,Base::getID=11 | Base.id=10,Base::getID=11 | Sub.id=20,Sub::getID=11 | Sub.id=21,Sub::getID=21 |  が出力される
C) Base.id=10,Base::getID=10 | Base.id=10,Base::getID=10 | Sub.id=20,Sub::getID=20 | Sub.id=21,Sub::getID=21 |  が出力される
D) Base.id=10,Base::getID=11 | Base.id=20,Base::getID=11 | Sub.id=11,Sub::getID=11 | Sub.id=21,Sub::getID=21 |  が出力される
E) Base.id=10,Base::getID=10 | Base.id=10,Base::getID=20 | Sub.id=20,Sub::getID=20 | Sub.id=21,Sub::getID=21 |  が出力される
F) Base.id=10,Base::getID=10 | Base.id=20,Base::getID=20 | Sub.id=11,Sub::getID=11 | Sub.id=21,Sub::getID=21 |  が出力される

解説

public class Main {
public static void main(String... args) {
Base b = new Sub(); //1. Base型でインスタンス化 Subクラスのコンストラクタ呼び出し

//3-1. b.idは、Base型のため、Baseクラスのidを呼び出し. 10
//3-2. b.getId()は、継承されたサブクラスのオーバーライドされたメソッドが優先して呼び出しされる. 11
System.out.print("Base.id=" + b.id + ",Base::getID=" + b.getId() + " | ");

//4-1. b.idは、Base型のため、Baseクラスのidを呼び出し. 10から20に書き換え
//4-2. b.getId()は、継承されたサブクラスのオーバーライドされたメソッドが優先して呼び出しされる. 11
b.id = 20;
System.out.print("Base.id=" + b.id + ",Base::getID=" + b.getId() + " | ");

//5-1. Base型のbをSubにキャスト 20
//5-2. b.getId()は、継承されたサブクラスのオーバーライドされたメソッドが優先して呼び出しされる. 11
Sub s = (Sub) b;
System.out.print("Base.id=" + b.id + ",Base::getID=" + b.getId() + " | ");

//5-1. Sub型のにキャストされたため、 20
//5-2. b.getId()は、継承されたサブクラスのオーバーライドされたメソッドが優先して呼び出しされる. 21
s.id = 21;
System.out.print("Base.id=" + b.id + ",Base::getID=" + b.getId() + " | ");
}
}

class Base {
public int id = 10; //3-1 //4-1 20に書き換え

public int getId() {
return id;
}
}

class Sub extends Base { //2. 暗黙的にSubコンストラクタを生成
int id = 11;

public int getId() { //3-2
return id;
}
}

前の問題へ SE17_B-58

次の問題へ SE17_B-60

対象資格:Java SE17 認定資格