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

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_A-34

次の問題へ SE17_A-36


対象資格:Java SE17 認定資格