15

考虑以下类:

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

2 回答 2

30

强制转换根本不会改变底层对象——它只是给编译器的一条消息,它可以将 anA视为B.

也没有必要将 an 强制A转换为Bif A extends B,即您不需要将子类型强制转换为其超类型;如果它是从超类型到子类型,您只需要转换

于 2013-04-25T20:39:30.797 回答
9

如果我要创建一个 Blackberry 实例,将其转换为 Phone 对象,然后再将其转换回 Blackberry,那么原始的 Blackberry 对象会丢失其成员变量吗?

你已经实例化了一个Blackberry. 这将一直保持Blackberry到它被 GCed 为止。
当你将它转换为Phone你并没有改变类型是Blackberry. 你只是把它当作一个Phoneie 你只能访问它的通用属性(那个Phone)。尽管具体实例仍然是 a并且您可以成功地将其转换回以访问属性,但
的扩展属性不再可见。BlackberryBlackberryBlackberry

于 2013-04-25T20:46:24.217 回答