Почему результат отличается в двух случаях?
Почему выходные данные отличаются в приведенном ниже случае, даже если переменная была переопределена?
public class A {
int a = 500;
void get() {
System.out.println("a is " + this.a);
}
}
public class B extends A {
int a = 144;
}
public class mainmethod {
public static void main(String args[]) {
B ob = new B();
System.out.println("a is " + ob.a);
ob.get();
}
}
3 ответа
Не существует переопределенных переменных. B
на самом деле имеет две переменные экземпляра с именем a
: один это объявляет, а другой наследует. Видеть это:
B ob = new B();
System.out.println("B.a is " + ob.a);
System.out.println("A.a is " + ((A)ob).a);
Внутри B
метод экземпляра вы можете написать super.a
или же ((A)this).a
чтобы получить доступ к родительской переменной.
Нет, переменная не переопределена.ob.a
выведите переменную класса B.ob.get()
ищет метод get в классе B. Когда он не попадает туда, он ищет родительский класс и выполняет его.
При выполнении ob.a
, вы получите переменную int a
от твоего ob
объект, который является объектом класса B
,
Тем не менее, когда вы делаете ob.get();
звонишь get()
метод из класса A
, потому что нет get()
в B
, который - как вы написали - использует this.a
, который был бы int a
класса A
в таком случае.