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

Aキャストは、基になるオブジェクトをまったく変更しません。これは、を として扱うことができるというコンパイラへの単なるメッセージBです。

また、 anABifにキャストする必要もA extends Bありません。つまり、サブタイプをそのスーパータイプにキャストする必要もありません。スーパータイプからサブタイプへのキャストのみが必要です

于 2013-04-25T20:39:30.797 に答える