Я играл с простой перегрузкой правил переопределения и нашел что-то интересное. Вот мой код.
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 вызывается?