блоки инициализации в полиморфизме

1

Я сомневаюсь

когда мы инициализируем наши переменные экземпляра в блоке инициализации экземпляра в случае наследования, переопределяют ли значение переменной?

Например

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)

Теги:
scjp

2 ответа

1

В первом примере у вас есть два объявления x, а во втором - только один. Во втором примере попробуйте изменить B на:

class B extends A {
    int x;
    { x=20; }
}

и вы увидите то же поведение, что и первый пример: B определяет новую переменную, которая имеет независимое значение от значения в A.

1

Вы можете переопределять только методы, а не переменные. Этот код не является "переопределяющим" переменным экземпляра.

Первый пример имеет разные переменные с именем x, определенные для A и B, в результате чего переменная A означает, что вы видите переменную, определенную для A (см. Ссылку, предоставленную paulk23). Во втором есть только одна переменная x, которая видна подклассу, инициализатор экземпляра присваивает значение существующей переменной.

  • 0
    если я сделаю это частным, это не будет видно в классе B.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню