Почему результат отличается в двух случаях?

Почему выходные данные отличаются в приведенном ниже случае, даже если переменная была переопределена?

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 в таком случае.

Другие вопросы по тегам