靜態繼承

靜態方法可以像普通方法一樣繼承,但是與普通方法不同,不可能建立“ 抽象 ”方法來強制靜態方法重寫。在超類中編寫與靜態方法具有相同簽名的方法似乎是一種覆蓋的形式,但實際上這只是建立一個新函式隱藏另一個。

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

請注意,與普通繼承不同,靜態繼承方法不會被隱藏。你始終可以使用 BaseClass.sayHello() 呼叫基本 sayHello 方法。但是如果在子類中找不到具有相同簽名的方法,類會繼承靜態方法。如果兩個方法的簽名不同,則兩個方法都可以從子類執行,即使名稱相同也是如此。

靜態欄位以類似的方式相互隱藏。