Я играл с простой перегрузкой правил переопределения и нашел что-то интересное. Вот мой код.
package com.demo;
public class Animal {
private void eat() {
System.out.println("animal eating");
}
public static void main(String args[]) {
Animal a = new Horse();
a.eat();
}
}
class Horse extends Animal {
public void eat() {
System.out.println("Horse eating");
}
}
Эта программа выводит ниже.
еда для животных
Вот что я знаю:
- Поскольку у нас есть метод
private void eat()
, он не обязательно будет доступен в подклассе, поэтому вопрос об переопределении метода здесь не возникает как JLS четко определяет его. - Теперь, когда это не метод переопределения, он определенно не будет вызывать метод
public void eat()
из класса Horse - Теперь наша декларация
Animal a = new Horse();
действительна из-за полиморфизма.
Почему a.eat()
вызывает метод из класса Animal
? Мы создаем объект Horse
, поэтому почему вызов метода класса Animal вызывается?