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

2

Учти это:

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

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

    }
}

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

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

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

Выйти из конструктора Animal

Человеческий конструктор

Я - животное

Выйти из конструктора Human

И не:

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

Я - животное

Выйти из конструктора Animal

Человеческий конструктор

Я - животное

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

  • 1
    Название вопроса смешное: D
  • 1
    Постарайтесь понять, как работает наследование и каковы типы объектов во время выполнения.
Показать ещё 1 комментарий
Теги:
polymorphism
inheritance

3 ответа

2
Лучший ответ

Линия

I'm Human

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

I'm an Animal

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

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

  • 0
    Спасибо, я могу понять это, и это все об архитектуре. Еще немного сбивает с толку. Как я понял, когда мы создаем производный класс, вот что происходит: 1-й инициирует базовый класс, а затем производный класс. Поэтому, когда он вызывает конструктор базового класса (я так думал), в теории экземпляр Human еще не существует, потому что он не был инициирован в тот момент. Вот почему я не аспектировал это поведение. Поблагодарить
0

Вы не можете напечатать "Я есть животное", потому что функция уже переопределяет и изменяет, поэтому почему она всегда печатает "Я человек", а не "Я животный",

если вы действительно хотите напечатать "Я человек", так лучшее решение выглядит так:

class Animal {
Animal(){
    System.out.println("Animal constructor called");
    indentifyMyself("animal");
    System.out.println("Exit Animal constructor");
}
void indentifyMyself(String type){
    System.out.println("I'm an Animal");
}

}
class Human extends Animal{
Human(){
    System.out.println("Human constructor called");
    super.indentifyMyself("human");
    System.out.println("Exit Human constructor");
}
@Override
void indentifyMyself(String type){
    if(type.equalsIgnoreCase("animal")){
        super.indentifyMyself(null);
    }else{
        System.out.println("I'm Human");
    }
 }
}
public class Main {

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

  }
}
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню