Я не понимаю этот пример наследования Java

#java #inheritance

#java #наследование

Вопрос:

Я делал mooc.fi конечно, и мне трудно понять наследование. В частности, этот пример.

Что печатает программа?

 public class Counter {

    public int addToNumber(int number) {
        return number   1;
    }
    
    public int subtractFromNumber(int number) {
        return number - 1;
    }
}


public class SuperCounter extends Counter {

    @Override
    public int addToNumber(int number) {
        return number   5;
    }
    
}



public static void main(String[] args) {
    Counter counter = new Counter();
    Counter superCounter = new SuperCounter();
    int number = 3;
    number = superCounter.subtractFromNumber(number);
    number = superCounter.subtractFromNumber(number);
    number = counter.addToNumber(number);
    System.out.println(number);
}
  

По-видимому, это не 6.
Некоторая помощь была бы признательна.

Комментарии:

1. Вы знаете, что SuperCounter является подклассом Counter .

Ответ №1:

Результат равен 2. Давайте посмотрим.

  1. Counter counter = new Counter(); дает нам counter addToNumber subtractFromNumber методы with и .
  2. Counter superCounter = new SuperCounter(); дает нам superCounter addToNumber метод with .
  3. int number = 3;
  4. number = superCounter.subtractFromNumber(number); Поскольку superCounter не переопределяет старый subtractFromNumber, он вычитает 1. Теперь number == 2 .
  5. number = superCounter.subtractFromNumber(number); То же самое, вычтите 1, number == 1 .
  6. number = counter.addToNumber(number); Этот метод добавляет 1. Now number == 2 .

Результат 2 , как мы и ожидали.

Ответ №2:

Вы создали 2 класса, и один наследует от другого (SuperCounter от Counter), что означает, что он наследует один метод «subtractFromNumber» и переопределяет другой метод «addToNumber».

Затем вы создаете экземпляры этих классов «counter» и «superCounter», вызывая метод «subtractFromNumber» для экземпляра класса «superCounter» 2 раза и метод «addToNumber» для другого экземпляра класса «counter». Но поскольку вы вызываете метод «addToNumber» для экземпляра класса «counter», соответственно, вызывается метод класса «Counter».

Согласно коду, вы получаете ответ «2»:

  1. int number = 3; // 3
  2. number = superCounter.subtractFromNumber(число); // 3 — 1 = 2
  3. number = superCounter.subtractFromNumber(число); // 2 — 1 = 1
  4. number = counter.addToNumber(число); // 1 1 = 2
  5. System.out.println(число); // 2

Комментарии:

1. Ответ в курсе — 8, поэтому я не уверен, что происходит.

2. Ответ курса неверен. Вы можете запустить код для себя, чтобы увидеть, что ответ равен 2. Ответ может быть только 8, если а) вычитания не было и б) вы использовали суперконтер для добавления номера.

3. Должно быть, это ошибка, сначала я думал, что это 2, затем, возможно, 6, но ни один из них не был принят. У них есть комната обратной связи telegram, поэтому я расскажу им об этом там.

4. Могу ли я задать еще один вопрос о наследовании в этой теме или мне нужно опубликовать новый вопрос?

5. Вам нужно написать новый вопрос.