Java 在父类之间来回转换后,子对象是否会丢失其唯一属性
考虑以下类别:Java 在父类之间来回转换后,子对象是否会丢失其唯一属性,java,oop,polymorphism,orientation,Java,Oop,Polymorphism,Orientation,考虑以下类别: public class Phone { private boolean has3g; public boolean has3g() { return has3g; } public void setHas3g(boolean newVal) { has3g = newVal; } } public class Blackberry extends Phone { private boolean
public class Phone {
private boolean has3g;
public boolean has3g() {
return has3g;
}
public void setHas3g(boolean newVal) {
has3g = newVal;
}
}
public class Blackberry extends Phone {
private boolean hasKeyboard;
public boolean hasKeyboard() {
return hasKeyboard;
}
public void setHasKeyboard(boolean newVal) {
hasKeyboard = newVal;
}
}
如果我要创建一个Blackberry
的实例,将其强制转换为Phone
对象,然后将其强制转换回Blackberry
,原始Blackberry
对象是否会丢失其成员变量?例如:
Blackbery blackbery = new Blackberry();
blackbery.setHasKeyboard(true);
Phone phone = (Phone)blackbery;
Blackberry blackberry2 = (Blackberry)phone;
// would blackberry2 still contain its original hasKeyboard value?
boolean hasKeyBoard = blackberry2.hasKeyboard();
强制转换根本不会更改底层对象-它只是给编译器的一条消息,它可以将
a
视为B
如果A扩展了B
,也不需要将A
强制转换为B
,即不需要将子类型强制转换为其超类型;只有在从超类型转换为子类型时才需要强制转换
如果我要创建Blackberry的一个实例,请将其转换到手机上
对象,然后将其扔回Blackberry,原始
Blackberry对象是否丢失其成员变量
您已经实例化了一个黑莓
。这将一直是一个Blackberry
,直到它被GCed。当您将其转换为
Phone
时,您并没有改变类型为Blackberry
的事实。您只是将其视为手机
,即您只能访问其通用属性(即手机
)。Blackberry
的扩展属性不再可见,尽管具体实例仍然是一个Blackberry
,您可以成功地将其强制转换回以访问Blackberry
属性。您尝试过吗?你这样做的时候发生了什么?我试过了,效果很好