Рассмотрим следующие классы:
class Parent {
int a;
}
class Child extends Parent {
int a; // error?
}
Если объявление a
в Child
не дать ошибку компиляции из-за нескольких объявлений int a
?
child.a
shadows (или hides ) parent.a
.
Это законная Java, но ее следует избегать. Я ожидаю, что в вашей среде IDE будет возможность предупредить вас об этом.
Обратите внимание, что это проблема только потому, что вы уже предоставили миру переменную . Если вы убедитесь, что все ваши переменные являются частными для начала (отделяя API методов от реализации полей), тогда не имеет значения, если и родительский, и дочерний элемент имеют одинаковые имена полей - дочерний элемент не будет в любом случае иметь возможность видеть поля родителя. Это может вызвать путаницу, если вы переместите метод от дочернего к родительскому, и это обычно не очень удобно для чтения, но лучше, чем ситуация сокрытия.
Это называется shadowing и может вызвать проблемы у разработчиков.
В вашем случае :
Child child = new Child();
child.a = 1;
System.out.println(child.a);
System.out.println(((Parent)child).a);
выведет
1
0
Это немного похоже на женитьбу на кузине: законно, но не рекомендуется.
Это может привести к всевозможной путанице, поскольку объявление подкласса скрывает объявление родительского класса.