Оказывает ли дочерний объект свои уникальные свойства после того, как кастинг между родительским классом
Рассмотрим следующие классы:
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();
Ответы
Ответ 1
Кастинг вообще не изменяет базовый объект - это просто сообщение компилятору, что он может обрабатывать A
как B
.
Также не нужно указывать A
на B
, если A extends B
, т.е. вам не нужно указывать подтип в свой супертип; вам нужен только бросок, если он от супертипа до подтипа
Ответ 2
Если бы я должен был создать экземпляр Blackberry, бросьте его на телефон объект, а затем отбросить его на Blackberry, будет ли оригинал Объект Blackberry потеряет свои переменные-члены?
Вы создали экземпляр Blackberry
. Это останется Blackberry
, пока он не будет GCed.
Когда вы отбрасываете его на Phone
, вы не меняете тот факт, что тип Blackberry
. Вы просто рассматриваете его как Phone
, то есть имеете доступ только к его общим свойствам (Phone
).
Расширенные свойства Blackberry
больше не видны, несмотря на то, что конкретный экземпляр по-прежнему является Blackberry
, и вы можете успешно вернуть его для доступа к свойствам Blackberry
.