問題
次のコードをコンパイル、実行するとどうなりますか。
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;
}
}
対象資格:Java SE17 認定資格