статические методы связаны с их классом во время компиляции и не могут использоваться полиморфно. Когда вы объявляете «статический» метод для Animal, он навсегда привязывается к классу Animal и не может быть переопределен. Статические методы связаны с объектом Class, а не с экземпляром Class.
Обычные методы связаны во время выполнения, поэтому JVM может посмотреть на ваш вызов «saySomething» и попытаться определить, передаете ли вы подкласс Animal, и если да, переопределил ли он метод saySomething()
. Обычные методы связаны с экземпляром объекта, а не с самим классом.
Вот почему вы так никогда не сможете:
class Animal
{
public abstract static void saySomething();
}
Поскольку «статический» означает «связанный во время компиляции», никогда не имеет смысла что-то статичное и абстрактное.