Полиморфизм и статические методы

У меня есть вопрос об этом коде прямо здесь.

public Car {
    public static void m1(){
        System.out.println("a");
    }
    public void m2(){
        System.out.println("b");
    }
}

class Mini extends Car {
    public static void m1() {
        System.out.println("c");
    }
    public void m2(){
        System.out.println("d");
    }
    public static void main(String args[]) {
        Car c = new Mini();
        c.m1();
        c.m2();       
   }
}

Я знаю, что полиморфизм не работает со статическими методами, а только с методами экземпляра. А также, что переопределение не работает для статических методов.

Поэтому я думаю, что эта программа должна распечатывать: c, d

Потому что c вызывает метод m1, но он статический, поэтому он не может переопределить и вызывает метод в классе Mini вместо Car.

Правильно ли это?

Однако мой учебник говорит, что ответ должен быть: a, d

Это опечатка? Потому что сейчас я немного запутался.

Пожалуйста, проясните это, спасибо.

Ответ 1

Потому что c вызывает метод m1, но он статический, поэтому он не может переопределить и вызывает метод в классе Mini вместо Car.

Точно назад.

c объявляется как Car, поэтому вызовы статических методов, выполненные с помощью c, вызывают методы, определенные Car.
Компилятор компилирует c.m1() непосредственно на Car.m1(), не зная, что c фактически содержит Mini.

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