Java - пример наследования атрибута - PullRequest
3 голосов
/ 08 марта 2020

Я озадачен этим примером наследования, найденным в викторине из курса Coursera Java:

  • класс B является подклассом класса A
  • класс B getPrefix() метод переопределяет класс 'A метод
  • класс B number атрибут переопределяет класс' атрибут * A
class ClassA {
    protected int number;

    public ClassA() {
        number = 20;
    }

    public void print() {
        System.out.println(getPrefix() + ": " + number);
    }

    protected String getPrefix() {
        return "A";
    }
}

class ClassB extends ClassA {
    protected int number = 10;

    protected String getPrefix() {
        return "B";
    }
}



public class Quizz {

    public static void main(String[] args) {

        ClassB b = new ClassB();
        b.print();

        ClassA ab = new ClassB();
        ab.print();

    }
}

Когда мы запускаем эту программу, выводится результат:

B: 20
B: 20

Однако вместо этого я ожидал этого результата:

B: 10
B: 10

Можете ли вы объяснить, почему печатается атрибут класса A number, а не класса B?

Ответы [ 2 ]

7 голосов
/ 08 марта 2020

Можете ли вы объяснить, почему печатается числовой атрибут класса A, а не класса B?

ClassB не наследует поле ClassA.number, а скрывает it.


См .:

В пределах класс, поле с тем же именем, что и поле в суперклассе, скрывает поле суперкласса.

3 голосов
/ 08 марта 2020

Да, так что вы можете переопределить метод из суперкласса, но вы не можете объявить другого члена класса с тем же именем. Вы создаете нового участника класса с именем. Он будет ссылаться только на 10, значение из суперкласса #number, если вы используете super.number вместо this.number.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...