Looking for java Keywords? Try Ask4Keywords

Java Language Статическое наследование


пример

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

public class BaseClass {
    
    public static int num = 5;

    public static void sayHello() {
        System.out.println("Hello");
    }

    public static void main(String[] args) {
        BaseClass.sayHello();
        System.out.println("BaseClass's num: " + BaseClass.num);
            
        SubClass.sayHello();
        //This will be different than the above statement's output, since it runs
        //A different method
        SubClass.sayHello(true);
        
        StaticOverride.sayHello();
        System.out.println("StaticOverride's num: " + StaticOverride.num);
    }
}

public  class SubClass extends BaseClass {
    
    //Inherits the sayHello function, but does not override it   
    public static void sayHello(boolean test) {
        System.out.println("Hey");
    }
}

public static class StaticOverride extends BaseClass {

    //Hides the num field from BaseClass
    //You can even change the type, since this doesn't affect the signature
    public static String num = "test";
        
    //Cannot use @Override annotation, since this is static
    //This overrides the sayHello method from BaseClass
    public static void sayHello() {
        System.out.println("Static says Hi");
    }

}

Запуск любого из этих классов дает результат:

Hello
BaseClass's num: 5
Hello
Hey
Static says Hi
StaticOverride's num: test

Обратите внимание, что в отличие от обычного наследования методы статического наследования не скрыты. Вы всегда можете вызвать базовый метод sayHello , используя BaseClass.sayHello() . Но классы наследуют статические методы, если в подклассе не найдены методы с одной и той же сигнатурой. Если разные сигнатуры метода различаются, оба метода можно запускать из подкласса, даже если имя одного и того же.

Статические поля скрыть друг друга аналогичным образом.