Подтвердить что ты не робот

Оказывает ли дочерний объект свои уникальные свойства после того, как кастинг между родительским классом

Рассмотрим следующие классы:

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

Ответ 1

Кастинг вообще не изменяет базовый объект - это просто сообщение компилятору, что он может обрабатывать A как B.

Также не нужно указывать A на B, если A extends B, т.е. вам не нужно указывать подтип в свой супертип; вам нужен только бросок, если он от супертипа до подтипа

Ответ 2

Если бы я должен был создать экземпляр Blackberry, бросьте его на телефон объект, а затем отбросить его на Blackberry, будет ли оригинал Объект Blackberry потеряет свои переменные-члены?

Вы создали экземпляр Blackberry. Это останется Blackberry, пока он не будет GCed.
Когда вы отбрасываете его на Phone, вы не меняете тот факт, что тип Blackberry. Вы просто рассматриваете его как Phone, то есть имеете доступ только к его общим свойствам (Phone).
Расширенные свойства Blackberry больше не видны, несмотря на то, что конкретный экземпляр по-прежнему является Blackberry, и вы можете успешно вернуть его для доступа к свойствам Blackberry.