Java 中的对象声明与赋值

Declaration of objects vs their assignment in Java

interface Drivable{}
class Vehicle implements Drivable{}
class Car extends Vehicle{}

Vehicle x= new Vehicle();
Drivable x= new Vehicle();
Car x = new Vehicle();
Object x = new Vehicle();
Vehicle[] x = new Vehicle();

其中有多少是正确的? 我很困惑,如果第二个 Drivable=... 和第 4 个对象 x=.. 是正确的

Car x = new Vehicle();是错误的,Vehicle[] x = new Vehicle();错了。

第二条语句很好 - 声明一个指向接口具体实现的接口没有问题。实际上的最佳实践(抽象和隐藏实现)。

第三条语句是非法的 - 您不能声明将引用基础 class 的具体实现。为什么 ?您将缺少声明类型的预期行为....

第 4 条语句很好,类似于第 2 条语句,只是使用了实现 class 而不是接口的基础。

第 5 条陈述是错误的,但很容易修复: 车辆[] x = {新车辆()};

你所有的 类 都是 "Drivable"

类型

"Vechile" 是 "Drivable" 类型,"Car" 是 "Vehicle" 类型,因此 "Car" 是 "Vehicle"。

"Car"和"Vehicle"都是"Drivable"。

你的所有初始化都是正确的,除了 "Car x = new Vehicle();" 和数组初始化,它应该看起来像这样

Vehicle[] x = new Vehicle[] { 
    //Vehicles go here
};

这是错误的,因为每辆车都是车辆,但反之则不然,即每辆车可能都不是汽车。继承是 "type of" 即 car 是车辆类型。

Car x = new Vehicle();

这里的x是数组类型,所以初始化错误

Vehicle[] x = new Vehicle();

应该是

Vehicle[] x = new Vehicle[size];