Нет. Переменные класса (также применимые к переменным экземпляра) не обладают переопределением в Java, поскольку переменные класса вызываются на основе типа вызывающего объекта. Добавлен еще один класс (Человек) в иерархию, чтобы сделать его более понятным. Итак, теперь у нас есть
Сын расширяет Папа расширяет Человека
В приведенном ниже коде мы пытаемся перебрать массив объектов Human, Dad и Son, но во всех случаях он печатает значения человеческого класса, поскольку тип вызывающего объекта был Human.
class Human
{
static String me = "human";
public void printMe()
{
System.out.println(me);
}
}
class Dad extends Human
{
static String me = "dad";
}
class Son extends Dad
{
static String me = "son";
}
public class ClassVariables {
public static void main(String[] abc) {
Human[] humans = new Human[3];
humans[0] = new Human();
humans[1] = new Dad();
humans[2] = new Son();
for(Human human: humans) {
System.out.println(human.me); // prints human for all objects
}
}
}
Распечатает
Таким образом, нет переопределения переменных класса.
Если мы хотим получить доступ к переменной класса фактического объекта из ссылочной переменной его родительского класса, нам нужно явно сообщить об этом компилятору, приведя родительскую ссылку (объект Human) к его типу.
System.out.println(((Dad)humans[1]).me); // prints dad
System.out.println(((Son)humans[2]).me); // prints son
Напечатает
О том, как часть этого вопроса: - Как уже предлагалось переопределить метод printMe () в классе Son, затем при вызове
Son().printMe();
Переменная класса «папа» папы «me» будет скрыта, потому что ближайшая декларация (из метода printme () класса Son) «me» (в классе Son) получит приоритет.