Метод getA()
определен только в суперклассе и может обращаться только к членам суперкласса. Он не может знать о a
подкласса, поэтому a
подкласса не может его затенять.
Не имеет значения, является ли член a
подкласса частным или открытым. Вы увидите такое же поведение, если объявите a
закрытым в дочернем классе.
Обновление. Это попытка ответить на более общий вопрос: Как разрешаются элементы, определенные как в родительском, так и в подклассах?
Рассмотрим следующее расширение примера OP:
class A {
public int a = 10;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
class B extends A {
public int a = 20;
}
class C extends B {
public int getA() {
return a;
}
}
public class Demo {
public static void main(String args[]) {
B a = new B();
System.out.println(a.getA());
C c = new C();
System.out.println(c.getA());
}
}
Здесь мы видим выходные данные 10
и 20
, которые подразумевают, что метод getA()
класса C
читает версию a
класса B.
Теперь давайте посмотрим, что произойдет, если мы сделаем версию A
для B
частной.
class B extends A {
private int a = 20;
}
Если мы попытаемся скомпилировать, мы получим ошибку компилятора:
Demo.java:18: error: a has private access in B
Приведенный выше эксперимент, кажется, предполагает, что каждый класс будет пытаться разрешить a
, глядя либо на себя, либо поднимаясь по иерархии классов, пока не найдет первый a
. Если этот a
ему виден (то есть public
или protected
), он вернет его. Если этот a
не виден, он просто не будет компилироваться.
person
merlin2011
schedule
23.03.2014