Почему этот код печатает значение суперкласса вместо подкласса - PullRequest
0 голосов
/ 06 января 2019
class A{
    int a = 10;
}

class B extends A{
    int a= 20;
}

public class C {
    public static void main(String [] args){
         A a = new B();
         System.out.println(a.a);       
        }
}

выход: 10

Как вывести значение из базового класса на основе приведенного выше кода.

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Когда вы создаете переменную с тем же именем в подклассе, как вы это сделали здесь, она называется скрытием. Полученный подкласс теперь будет фактически иметь оба свойства.

Пожалуйста, обратитесь к изображению ниже,

enter image description here

0 голосов
/ 06 января 2019

B уже наследует a от A. Выполнение int a = 20; снова скрывает a, унаследованного от A. Это означает, что выражение вида x.a будет иметь значение только 20, если время компиляции x равно B.

Чтобы получить ожидаемое поведение, вы можете сбросить a в конструкторе B:

class B {
    // no need to redeclare "a" here!
    public B() { a = 20; }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...