【问题标题】:Declaration of objects vs their assignment in Java对象的声明与它们在 Java 中的分配
【发布时间】:2023-04-07 19:04:01
【问题描述】:
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=.. 是对的
【问题讨论】:
标签:
java
variable-assignment
variable-declaration
【解决方案1】:
汽车 x = new Vehicle();错了,Vehicle[] x = new Vehicle();错了。
第二条语句很好——声明一个指向接口具体实现的 iterface 没有问题。最佳实践(抽象和隐藏实现)。
第三条语句是非法的——你不能声明一个引用基类的具体实现。为什么 ?您将错过声明类型的预期行为....
第 4 条语句很好,与第 2 条语句类似,只是使用基实现类而不是接口。
第 5 条语句是错误的,但很容易修复:
车辆[] x = {新车辆()};
【解决方案2】:
你所有的类都是“Drivable”类型的
“Vechile”属于“Drivable”类型,“Car”属于“Vehicle”类型,因此“Car”就是“Vehicle”。
“汽车”和“车辆”都是“可驾驶”的。
所有的初始化都是正确的,除了“Car x = new Vehicle();”和数组初始化,应该是这样的
Vehicle[] x = new Vehicle[] {
//Vehicles go here
};
【解决方案3】:
这是错误的,因为每辆车都是车辆,但不是相反,即每辆车都可能不是汽车。继承是“类型”,即汽车是车辆的类型。
Car x = new Vehicle();
这里x是数组类型,所以初始化错误。
Vehicle[] x = new Vehicle();
应该是
Vehicle[] x = new Vehicle[size];