Учти это:
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". Заранее спасибо
Линия
I'm Human
печатается вместо ожидаемого
I'm an Animal
потому что фактический тип экземпляра экземпляра - это Human
а не Animal
, поэтому переопределенная функция выбирается из таблицы виртуальных методов.
Как обсуждалось здесь, поведение Java и C++ отличается в этом аспекте.
Вы не можете напечатать "Я есть животное", потому что функция уже переопределяет и изменяет, поэтому почему она всегда печатает "Я человек", а не "Я животный",
если вы действительно хотите напечатать "Я человек", так лучшее решение выглядит так:
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();
}
}
Вы переопределили этот метод, и во время выполнения JVM выполняет эту переопределенную новую версию метода. Не старый в классе животных