Java基礎:記住,Java的static方法無法被重寫,也沒必要


在Java中,靜態(static)方法,是屬於類方法,可以通過類直接調用,當然也可以通過實例對象進行調用,但不建議,也沒必要。
相應的,有靜態變量,屬於類變量。

注意:

  1. 靜態方法是無法被重寫(Override)的,如果強行加上 @Override 注解,編譯時會報錯 “java: 方法不會覆蓋或實現超類型的方法”
    原因:重寫的作用是為了父類和子類的相同簽名的方法,具有不同的行為,從而實現了 多態 。但是靜態方法是被類直接調用的,和對象無關,不存在父子類對象之間的相同方法不同行為,所以也沒有多態。

  2. 子類可以直接調用父類的靜態方法。
    雖說子類無法重寫父類的靜態方法,但是卻可以直接調用父類的靜態方法,調用方式是 子類名.父類靜態方法() ,當然,也可以 子類對象.父類靜態方法(),不過沒必要,也不建議。

經過親測。測試代碼如下:

// 省略 package

public class SuperClass {

    public String m1() {
        return "a1";
    }

    public static String m2() {
        return "a2";
    }

    static class SubClass extends SuperClass {

        @Override
        public String m1() {
            return "b1";
        }

        /* @Override 添加該注解后報錯:Method does not override method from its superclass(方法不會覆蓋或實現超類型的方法)
         public static String m2() {
            return "b2";
        }
         */
    }

    public static void main(String[] args) {

        // 按照習慣,應該命名為superClass。之所以命名為 superC,是為了更清楚地區分 子類名稱 和 子類對象名稱
        SuperClass superC = new SuperClass();
        // 父類對象 調用 普通方法 m1()
        System.out.println(superC.m1());
        // 父類 調用 靜態方法 m2()
        System.out.println(SuperClass.m2());
        // 父類對象 調用 靜態方法 m2(),可以,但沒必要,不建議
        System.out.println(superC.m2());

        // 按照習慣,應該命名為subClass。之所以命名為 subC,是為了更清楚地區分 子類名稱 和 子類對象名稱
        SuperClass subC = new SubClass();
        // 子類對象 調用被重寫的 普通方法 m1()
        System.out.println(subC.m1());
        // 子類 調用 靜態方法 m2(),其實是父類的 m2() 的行為
        System.out.println(SubClass.m2());
        // 子類對象 調用 靜態方法 m2(),可以,但沒必要,不建議
        System.out.println(subC.m2());
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM