Скрытие метода в наследовании 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 ответа

Решение

По характеристикам статических методов,

  1. мы не можем переопределить статические методы.
  2. Если метод является статическим и вы объявляете тот же метод в унаследованном классе с тем же базовым классом, он не будет скрыт.

Пожалуйста, проверьте ниже правила из 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";
    } 
}
Другие вопросы по тегам