我在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类扩展而来?
据我了解,强制转换的目的是限制对对象(类实例)某些方法的访问。因此,您不能将对象转换为比该对象实际分配的类具有更多方法的更具体的类。这意味着该对象只能转换为超类或与实际实例化该类的类相同的类。这是正确的还是我错了?我仍在学习,所以不确定这是否是正确看待事物的方法。
我也知道这应该是向下转换的示例,但是如果实际类型没有向下转换该对象的类的方法,则我不确定这实际上如何工作。显式转换是否会以某种方式更改对象的实际类型(而不仅仅是声明的类型),从而使该对象不再是HeavyVehicle类的实例,而是现在成为Truck类的实例?
绝地无双
不负相思意
开心每一天1111
相关分类