Java Language Herencia estática


Ejemplo

El método estático se puede heredar de forma similar a los métodos normales, sin embargo, a diferencia de los métodos normales, es imposible crear métodos " abstractos " para forzar la anulación del método estático. Escribir un método con la misma firma que un método estático en una súper clase parece ser una forma de anulación, pero en realidad esto simplemente crea una nueva función que oculta a la otra.

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");
    }

}

La ejecución de cualquiera de estas clases produce el resultado:

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

Tenga en cuenta que, a diferencia de la herencia normal, en los métodos de herencia estática no están ocultos. Siempre puede llamar al método base sayHello usando BaseClass.sayHello() . Pero las clases heredan métodos estáticos si no se encuentran métodos con la misma firma en la subclase. Si las firmas de dos métodos varían, ambos métodos pueden ejecutarse desde la subclase, incluso si el nombre es el mismo.

Los campos estáticos se ocultan entre sí de forma similar.