Скрытие метода в наследовании Java
У меня есть два класса следующим образом:
public class Car {
public static void print() {
System.out.println(getWord());
}
public static String getWord() {
return "CAR";
}
}
public class BMW extends Car {
public static String getWord() {
return "BMW";
}
}
// main method
public static void main(String args[]) {
BMW.print();
}
После того, как я запустил приведенный выше пример, выводится:
АВТОМОБИЛЬ
Мой вопрос: почему метод getWord()
не переопределены?
4 ответа
По характеристикам статических методов,
- мы не можем переопределить статические методы.
- Если метод является статическим и вы объявляете тот же метод в унаследованном классе с тем же базовым классом, он не будет скрыт.
Пожалуйста, проверьте ниже правила из Java Doc:
Переопределение: Переопределение в Java просто означает, что конкретный метод будет вызываться на основе типа времени выполнения объекта, а не типа его времени компиляции (что имеет место с переопределенными статическими методами).
Скрытие: Статические методы родительского класса не являются частью дочернего класса (хотя они доступны), поэтому не стоит переопределять его. Даже если вы добавите другой статический метод в подкласс, идентичный методу в его родительском классе, этот статический метод подкласса является уникальным и отличается от статического метода в его родительском классе.
Статические методы не могут быть переопределены, потому что переопределение методов происходит только в контексте динамического поиска методов (т.е. во время выполнения). Статические методы (по их названию) ищутся статически (т.е. во время компиляции).
В Java: поля и static
методы не придерживаются динамического / динамического полиморфизма. Когда вы звоните BMW.print()
, он наследует статическое определение от Car
, Быть static
вызов функции это относится к Car.getWord()
getWord()
метод в классе BMW
не вызывается при звонке BMW.print()
так как static
методы связаны с class
, не экземпляр класса. Как только вы сделаете звонок на static
метод BMW.print()
требуется несколько вещей:
- Все вызовы методов сделаны из
BMW.print()
также должен бытьstatic
методы, если они определены внутриBMW
учебный класс - Нет понятия наследования, то есть вызова
getWord()
Метод не будет распространяться на дочерний класс. Причина этого в том, чтоgetWord()
этоstatic
метод, связанный сCar
сам класс.
Если вы действительно хотите получить свой текущий код для печати "BMW"
Вы можете попробовать следующее (что не очень хороший дизайн):
public class Car {
public static void print() {
System.out.println(BMW.getWord());
}
public static String getWord() {
return "CAR";
}
}