Java 中的显式类型转换示例
我在 http://www.javabeginner.com/learn-java/java-object-typecasting 上遇到过这个例子,在它谈论显式类型转换的部分,有一个例子让我感到困惑。
示例:
class Vehicle {
String name;
Vehicle() {
name = "Vehicle";
}
}
class HeavyVehicle extends Vehicle {
HeavyVehicle() {
name = "HeavyVehicle";
}
}
class Truck extends HeavyVehicle {
Truck() {
name = "Truck";
}
}
class LightVehicle extends Vehicle {
LightVehicle() {
name = "LightVehicle";
}
}
public class InstanceOfExample {
static boolean result;
static HeavyVehicle hV = new HeavyVehicle();
static Truck T = new Truck();
static HeavyVehicle hv2 = null;
public static void main(String[] args) {
result = hV instanceof HeavyVehicle;
System.out.print("hV is an HeavyVehicle: " + result + "\n");
result = T instanceof HeavyVehicle;
System.out.print("T is an HeavyVehicle: " + result + "\n");
result = hV instanceof Truck;
System.out.print("hV is a Truck: " + result + "\n");
result = hv2 instanceof HeavyVehicle;
System.out.print("hv2 is an HeavyVehicle: " + result + "\n");
hV = T; //Sucessful Cast form child to parent
T = (Truck) hV; //Sucessful Explicit Cast form parent to child
}
}
在 T 被分配了参考 hV 和类型转换为 (Truck) 的最后一行中,为什么它在注释中说这是从父到子的成功显式强制转换?据我所知,强制转换(隐式或显式)只会更改声明的对象类型,而不会更改实际类型(除非您实际为该对象的字段引用分配新的类实例,否则不应更改)。如果 hv 已经分配了一个 HeavyVehicle 类的实例,该类是 Truck 类的超类,那么如何将此字段类型转换为从 HeavyVehicle 类扩展而来的更具体的子类 Truck?
我的理解是,强制转换的目的是限制对对象(类实例)的某些方法的访问。因此,不能将对象转换为比对象实际分配的类具有更多方法的更具体的类。这意味着该对象只能被转换为超类或与实际实例化它的类相同的类。这是正确的还是我在这里错了?我还在学习,所以我不确定这是否是看待事物的正确方式。
我也明白这应该是下放的一个例子,但是我不确定如果实际类型没有此对象被下放到的类的方法,这实际上是如何工作的。显式转换是否以某种方式更改了对象的实际类型(而不仅仅是声明的类型),因此此对象不再是 HeavyVehicle 类的实例,而是现在成为 Truck 类的实例?