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
属性。

您尝试过吗?你这样做的时候发生了什么?我试过了,效果很好