Могут ли родительский и дочерний класс в Java иметь одну и ту же переменную экземпляра?

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

class Parent {
 int a;
}

class Child extends Parent {
 int a; // error?
}

Если объявление a в Child не дать ошибку компиляции из-за нескольких объявлений int a ?

15
задан Joachim Sauer 17 August 2010 в 09:31
поделиться

3 ответа

child.a shadows (или hides ) parent.a .

Это законная Java, но ее следует избегать. Я ожидаю, что в вашей среде IDE будет возможность предупредить вас об этом.

Обратите внимание, что это проблема только потому, что вы уже предоставили миру переменную . Если вы убедитесь, что все ваши переменные являются частными для начала (отделяя API методов от реализации полей), тогда не имеет значения, если и родительский, и дочерний элемент имеют одинаковые имена полей - дочерний элемент не будет в любом случае иметь возможность видеть поля родителя. Это может вызвать путаницу, если вы переместите метод от дочернего к родительскому, и это обычно не очень удобно для чтения, но лучше, чем ситуация сокрытия.

21
ответ дан 1 December 2019 в 01:16
поделиться

Это называется shadowing и может вызвать проблемы у разработчиков.

В вашем случае :

Child child = new Child();
child.a = 1;
System.out.println(child.a);
System.out.println(((Parent)child).a);

выведет

1
0
9
ответ дан 1 December 2019 в 01:16
поделиться

Это немного похоже на женитьбу на кузине: законно, но не рекомендуется.

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

7
ответ дан 1 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: