Полиморфизм и статические методы
У меня есть вопрос об этом коде прямо здесь.
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
.
Вот почему вы никогда не должны вызывать статические методы через такой экземпляр.