Основной ответ c заключается в том, что при использовании простого доступа к переменной невозможно обеспечить динамическое разрешение переменной относительно конкретного типа экземпляра, к которому осуществляется доступ. Какая переменная будет разрешена, зависит от объявленного типа экземпляра, к которому осуществляется доступ. Например:
public class SampleGrandparent {
public static void main(String[] args) {
(new SampleChild(0)).printMe();
}
public int value;
public SampleGrandparent(int value) {
this.value = value;
}
public static class SampleParent extends SampleGrandparent {
@SuppressWarnings("hiding")
public int value;
public SampleParent(int value) {
super(value + 1);
this.value = value;
}
}
public static class SampleChild extends SampleParent {
@SuppressWarnings("hiding")
public int value;
public SampleChild(int value) {
super(value + 1);
this.value = value;
}
public void printMe() {
System.out.println("Child Value [ " + value + " ]");
System.out.println("Parent Value [ " + ((SampleParent) this).value + " ]");
System.out.println("Grandparent Value [ " + ((SampleGrandparent) this).value + " ]");
}
}
}
Для динамического разрешения c необходимо будет использовать методы.
Частично это можно обойти, но только если известны все переменные и имена подклассов. суперклассу. Например:
public class SampleGrandparent {
public static void main(String[] args) {
SampleGrandparent gp = new SampleParent(0);
gp.printMe();
}
public int value;
public SampleGrandparent(int value) {
this.value = value;
}
public void printMe() {
if ( this instanceof SampleChild ) {
System.out.println("Child Value [ " + ((SampleChild) this).value + " ]");
}
if ( this instanceof SampleParent) {
System.out.println("Parent Value [ " + ((SampleParent) this).value + " ]");
}
System.out.println("Grandparent Value [ " + value + " ]");
}
public static class SampleParent extends SampleGrandparent {
@SuppressWarnings("hiding")
public int value;
public SampleParent(int value) {
super(value + 1);
this.value = value;
}
}
public static class SampleChild extends SampleParent {
@SuppressWarnings("hiding")
public int value;
public SampleChild(int value) {
super(value + 1);
this.value = value;
}
}
}
В суперклассе может быть записан метод получения, который выполняет те же функции, что и printMe.
Все это становится довольно уродливым и не рекомендуется.