Я сомневаюсь
когда мы инициализируем наши переменные экземпляра в блоке инициализации экземпляра в случае наследования, переопределяют ли значение переменной?
Например
class A{
int x;
}
class B extends A{
int x = 10;
}
public class C{
public static void main(String[] args){
A K = new B();
System.out.println(K.x);
}
}
o/p : 0
Однако, когда я использую блоки инициализации
class A{
int x;
{x = 15;}
}
class B extends A{
{x=20;}
}
public class C{
public static void main(String[] args){
A K = new B();
System.out.println(K.x);
}
}
OUTPUT 20
Почему это так? почему мой блок инициализации влияет на переменные экземпляра? Более того, я знаю, что блоки вызывается, когда мы создаем объект, но все же переменная на выходе должна соответствовать типу переменной, т.е. AK (K должен давать значение, соответствующее классу A)
В первом примере у вас есть два объявления x, а во втором - только один. Во втором примере попробуйте изменить B на:
class B extends A {
int x;
{ x=20; }
}
и вы увидите то же поведение, что и первый пример: B определяет новую переменную, которая имеет независимое значение от значения в A.
Вы можете переопределять только методы, а не переменные. Этот код не является "переопределяющим" переменным экземпляра.
Первый пример имеет разные переменные с именем x, определенные для A и B, в результате чего переменная A означает, что вы видите переменную, определенную для A (см. Ссылку, предоставленную paulk23). Во втором есть только одна переменная x, которая видна подклассу, инициализатор экземпляра присваивает значение существующей переменной.