我正在测试协变返回类型,并遇到了这个问题。

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的表达式。

09-19 08:37