TL; DR: если вы вводите новое поле в подкласс, не используйте повторно имя поля из родительского класса.Вы ничего не получаете, только путаница и проблемы.
Если я правильно понимаю, вы хотите, чтобы SubClass
экземпляров имели два поля, одно унаследованное от SuperClass
(для обсуждения давайте переименуем его вsuperX
, чтобы прояснить ситуацию) и один из самого подкласса (давайте переименуем его в subX
).
Для данного экземпляра SubClass
вы хотите иметь доступ к обоим полям superX
и subX
(конечно, используя разные выражения).Что делает вещи сложными в вашем примере кода, так это тот факт, что вы решили дать им обоим одинаковое имя x
.
Итак, если вы действительно хотите, чтобы ваши экземпляры содержали оба поля, я бы порекомендовалчтобы переименовать их, чтобы вам не приходилось использовать уродливые уловки, такие как приведение к SuperClass
.
public class SuperClass{
protected int superX = 0;
}
public class SubClass extends SuperClass{
protected int subX = 1;
}
Но, если x
обозначает одно и то же свойство с одинаковым значением для обоих супери подкласс, просто с разными начальными значениями, тогда не имеет смысла иметь два разных поля, и вы должны изменить код, чтобы он стал:
public class SuperClass{
protected int x = 0;
}
public class SubClass extends SuperClass{
// constructor initializes the x field with 1.
public SubClass(){
x = 1;
}
}
Конечно, тогда невозможно получитьдва разных значения из одного экземпляра SubClass
.