当我尝试将父对象分配给子引用时,控制台上显示的是编译时错误。为什么不能将父对象分配给java中的子引用?
答案 0 :(得分:-1)
作为user7 said和Stultuske updated,Car
是Vehicle
,但并非所有Vehicles
都是Car
。所以这个:
Vehicle v = /*...some kind of Vehicle...*/;
Car c = v;
......毫无意义。如果v
没有引用Car
实例,该怎么办?
更正式地说,它会违反合同。说我们有:
class Vehicle {
}
class Car extends Vehicle {
public void drive() {
// ...
}
}
假设这实际上有效:
Car c = new Vehicle(); // Doesn't work, but let's pretend it does
如果拨打c.drive()
会怎么样?合同(Car
)表示它有drive
方法,但对象(类型Vehicle
)却没有。
即使Car
没有添加任何(公共)功能,但仍然会产生Car
类型的变量(根据定义,它指的是{{} 1}} Car
子类的实例或实例)引用Car
对象。 Vehicle
不一定是Vehicle
。
如果您对某个对象有Car
引用,并且您知道该对象实际上是Vehicle
,那么您可以将其投射:
Car
......因为那里没有不匹配;该对象实际上是Vehicle v = new Car();
Car c = (Car)v;
。演员告诉编译器,程序员,你对Car
所指的实际与v
兼容的对象负责。 (并且JVM会在运行时进行检查,因此如果您错了,则会得到Car
。)