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

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

class Parent {
 int a;
}

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

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

Ответы [ 4 ]

21 голосов
/ 17 августа 2010

child.a тени (или скрывает ) parent.a.

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

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

9 голосов
/ 17 августа 2010

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

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

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

напечатает

1
0
6 голосов
/ 17 августа 2010

Это немного похоже на женитьбу на твоей кузине;Разрешено, но не рекомендуется.

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

0 голосов
/ 06 марта 2017

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...