子对象在父类之间来回转换后是否会丢失其唯一属性

2022-09-03 09:16:40

请考虑以下类:

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;
    }
}

如果我要创建 一个实例,将其强制转换为一个对象,然后将其转换回 ,原始对象是否会丢失其成员变量?例如:BlackberryPhoneBlackberryBlackberry

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();

答案 1

强制转换根本不会更改基础对象 - 它只是给编译器的一条消息,它可以将 a 视为 .AB

也没有必要将 a 强制转换为 if ,即您不需要将子类型转换为其超类型;仅当从超类型到子类型时才需要强制转换ABA extends B


答案 2

如果我要创建一个黑莓实例,将其强制转换为 Phone 对象,然后将其转换回黑莓,原始黑莓对象是否会丢失其成员变量?

您已实例化了 .这将一直保持到它被GCed。
当您将其强制转换为时,您不会更改类型为 .您只是将其视为一个,即您只能访问其泛型属性(的 )。
的扩展属性不再可见,尽管具体实例仍然是一个,您可以成功地将其转换回以访问这些属性。BlackberryBlackberryPhoneBlackberryPhonePhoneBlackberryBlackberryBlackberry