Почему это печатает это, а не то? - PullRequest
0 голосов
/ 05 сентября 2018

Учтите это:

class Animal {
    Animal(){
        System.out.println("Animal's constructor called");
        this.indentifyMyself();//??????????????
        System.out.println("Exit Animal's constructor");
    }
    void indentifyMyself(){
        System.out.println("I'm an Animal");
    }
}
class Human extends Animal{
    Human(){
        System.out.println("Human's constructor called");
        super.indentifyMyself();
        System.out.println("Exit Human's constructor");
    }
    @Override
    void indentifyMyself(){
        System.out.println("I'm Human");
    }
}
public class Main {

    public static void main(String[] args) {
        new Human();

    }
}

Почему он печатает?

Конструктор животных под названием

Я человек (??? Я этого не ожидал)

Выход из конструктора животных

Конструктор человека по имени

Я - Животное

Выход из конструктора человека

А не:

Конструктор животных под названием

Я - Животное

Выход из конструктора животных

Конструктор человека по имени

Я - Животное

Если кто-нибудь сможет дать подробное объяснение этого поведения, я буду очень благодарен. Пожалуйста, не говорите мне избыточные ответы, такие как «Полиморфное поведение Java». Заранее благодарен

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вы переопределили этот метод, и во время выполнения JVM выполнит эту переопределенную новую версию метода. Не старый в классе животных

0 голосов
/ 05 сентября 2018

Линия

I'm Human

печатается вместо ожидаемого

I'm an Animal

поскольку фактический тип времени выполнения экземпляра равен Human, а не Animal, следовательно, переопределенная функция выбирается из таблицы виртуальных методов.

Как обсуждено здесь , поведение Java и C ++ отличается в этом аспекте.

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