English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Почему статические методы родительского класса скрыты в подклассе Java?

Когда у нас есть два класса, один расширяет другой класс, и если эти два класса имеют одинаковые методы, включая параметры и тип возвращаемого значения (например,样本), то метод в подклассе будет перекрывать метод в суперклассе.

то это из-за наследования. Если мы инстанцируем подкласс, то в объекте подкласса создается копия члена суперкласса, поэтому оба метода могут быть использованы для объектов подкласса.

но если вызвать метод(样本)в этом случае будет выполнен метод样本 подкласса, чтобы скрыть метод суперкласса.

Пример

class Super{
   public static void sample(){
      System.out.println("Метод суперкласса");
   }
}
public class OverridingExample extends Super {
   public static void sample(){
      System.out.println("Метод подкласса");
   }
   public static void main(String args[]){
      Super obj1 = (Super) new OverridingExample();
      OverridingExample obj2 = new OverridingExample();
      obj1.sample();
      obj2.sample();
   }
}

Результат вывода

Метод суперкласса
Метод подкласса

Перегрузка статического метода

Когда суперкласс и подкласс содержат одинаковые методы (включая параметры) и они статичны, метод в суперклассе будет скрыт методом в подклассе.

Эта механика называется «методом скрытия метода», несмотря на то, что у суперкласса и подкласса есть статические методы с одинаковым сигнатурой, они не считаются перегруженными.

Пример

class Super{
   public static void demo() {
      System.out.println("Это основной метод суперкласса");
   }
}
class Sub extends Super{
   public static void demo() {
      System.out.println("Это основной метод подкласса");
   }
}
public class MethodHiding{}}
   public static void main(String args[]) {
      MethodHiding obj = new MethodHiding();
      Sub.demo();
   }
}

Результат вывода

Это главный метод подкласса

Причина скрытия методов

Ключевым моментом метода overload является то, что если у суперкласса и подкласса есть методы с одинаковой подписью, то для объектов подкласса они оба доступны. Выполнение соответствующего метода зависит от типа объекта (ссылки), который используется для сохранения объекта.

SuperClass obj1 = (Super) new SubClass();
obj1.demo() //вызывает метод demo суперкласса
SubClass obj2 = new SubClass();
obj2.demo() //вызывает метод demo подкласса

Но, в случае с статическими методами, так как они не принадлежат ни к одному экземпляру, вам нужно использовать имя класса для доступа.

SuperClass.demo();
SubClass.Demo();

Таким образом, если у суперкласса и подкласса есть статические методы с одинаковой подписью, то объект подкласса может использовать копию метода суперкласса. Поскольку они статичны, вызовы методов решаются автоматически на этапе компиляции, поэтому статические методы не могут быть overridden.

Но, так как можно использовать копию статического метода, если вы вызовете метод подкласса, то метод суперкласса будет переопределен/скрыт.

Основной учебник
Вам может понравиться