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

S-K*_*-K' 15 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 hasKeyboard;

    public boolean hasKeyboard() {
        return hasKeyboard;
    }

    public void setHasKeyboard(boolean newVal) {
        hasKeyboard = newVal;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我要创建一个实例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();
Run Code Online (Sandbox Code Playgroud)

Zim*_*oot 27

转换根本不会改变底层对象 - 它只是向编译器发出的消息,它可以将其A视为一个B.

也没有必要将if A转换为Bif A extends B,即你不需要将子类型转换为其超类型; 如果从超类型到子类型,你只需要演员表


Cra*_*lus 9

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

你已经实例化了一个Blackberry.这将保持Blackberry一直到它是GCed.
当你把它投射到Phone你时,并没有改变这种类型的事实Blackberry.您只是将其视为一种Phone即使您只能访问其通用属性(即Phone)的属性.尽管具体实例仍然是a 并且您可以成功地将其强制转换为访问属性,但
扩展属性Blackberry不再可见.BlackberryBlackberry