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

Рассмотрим эти классы:

class Parent {
 int a;
}

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

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

Ответы

Ответ 1

child.a тени (или шкуры) parent.a.

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

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

Ответ 2

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

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

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

будет печатать

1
0

Ответ 3

Его немного похоже на женитьбу на кузена; Юридический, но не рекомендуется.

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

Ответ 4

Не будет ошибок компиляции или ошибок времени выполнения.

public class Parent {
private String name;
private int age;
}

public class Child extends Parent {
String parent;
public int age;
}

Здесь вы сможете получить доступ к child.age из основного класса... Это единственное преимущество, которое вы можете получить, имея общедоступную переменную для производного класса