我正在测试协变返回类型,并遇到了这个问题。
class Vehicle {
int i = 3;
}
class Car extends Vehicle{
int i = 5;
public Car returningCar(){
System.out.println("Returning Car");
return new Car();
}
public Vehicle returningCarInVehicle(){
System.out.println("Returning CarInVehicle");
return new Car();
}
}
public class ScjpTest{
public static void main(String[] args){
Car car = new Car();
Vehicle vehicleCar = car.returningCar();
Vehicle vehicleCar2 = car.returningCarInVehicle();
System.out.println("vehicleCar " + vehicleCar.i);
System.out.println("vehicleCar2 " + vehicleCar2.i);
}
}
上面的输出是Returning Car
Returning
CarInVehicle
vehicleCar 3
vehicleCar2 3
我不明白为什么输出为3。我期望两个实例中的输出均为5,因为在运行时JVM使用的是实际对象而不是引用。
谢谢
最佳答案
字段不是虚拟/可覆盖/等。它们将根据引用的编译时类型(在本例中为Vehicle
)进行解析。
此代码将显示“ vehicleCar2 5”:
System.out.println("vehicleCar2 " + ((Car)vehicleCar2).i);
由于强制转换会生成编译时类型
Car
的表达式。