Вопрос-ответ

Overriding member variables in Java ( Variable Hiding)

Переопределение переменных-членов в Java (скрытие переменных)

Я изучаю переопределяющие функции-члены в Java и подумал о том, чтобы поэкспериментировать с переопределяющими переменными-членами.

Итак, я определил классы

public class A{
public int intVal = 1;
public void identifyClass()
{
System.out.println("I am class A");
}
}

public class B extends A
{
public int intVal = 2;
public void identifyClass()
{
System.out.println("I am class B");
}
}

public class mainClass
{
public static void main(String [] args)
{
A a = new A();
B b = new B();
A aRef;
aRef = a;
System.out.println(aRef.intVal);
aRef.identifyClass();
aRef = b;
System.out.println(aRef.intVal);
aRef.identifyClass();
}
}

Результатом является:

1
I am class A
1
I am class B

Я не могу понять, почему, когда aRef имеет значение b, intVal по-прежнему относится к классу A?

Переведено автоматически
Ответ 1

Когда вы создаете переменную с тем же именем в подклассе, это называется скрытием. Результирующий подкласс теперь будет обладать обоими свойствами. Вы можете получить доступ к переменной-члену из суперкласса с помощью super.var или ((SuperClass)this).var. Переменные даже не обязательно должны быть одного типа; это просто две переменные с общим именем, очень похожие на два перегруженных метода.

Ответ 2

Переменные в Java не являются полиморфными; они не переопределяют друг друга.

Ответ 3

В Java нет полиморфизма для полей.

Variables решение принимается во время компиляции, поэтому всегда будут доступны переменные базового класса (не наследуемые дочерними переменными).

Поэтому всякий раз, когда происходит апкастинг, всегда помните

1) Будут доступны переменные базового класса.

2) Будут вызваны методы подкласса (переопределенные методы, если произошло переопределение, иначе унаследованные методы, как от родительского).

Ответ 4

Переменные разрешаются во время компиляции, методы - во время выполнения. aRef имеет тип A, следовательно aRef .Intvalue во время компиляции разрешается в 1.

java