1. 程式人生 > >Java子類繼承父類,類的載入順序,看著一篇就夠了

Java子類繼承父類,類的載入順序,看著一篇就夠了

1. 程式碼

package parent;

public class Child extends Father {
    static {
        System.out.println("子類靜態程式碼塊無變數");
    }

    static int c = 6;

    static {
        c = c + 10;
        System.out.println("子類靜態程式碼塊,c=" + c);
    }

    public Child() {
        c = c + 100;
        System.out.println("子類建構函式c=" + c);
    }

    {
        c = c + 1000;
        System.out.println("子類構造程式碼塊c=" + c);
    }

    @Override
    public void putong() {
        c = c + 500;
        System.out.println("子類重寫父類的私有普通方法c=" + c);
    }


    public static void staticMethod() {
        c = c + 500;
        System.out.println("子類寫一個和父類名字一樣的靜態方法c=" + c);
    }

    public static void main(String[] args) {
        Child child = new Child();
        child.putong();
        staticMethod();
    }
}

2. 結果

父類靜態程式碼塊無輸出
父類靜態程式碼塊501
子類靜態程式碼塊無變數
子類靜態程式碼塊,c=16
父類構造程式碼塊:a: 511
父類構造方法執行,a:611
子類構造程式碼塊c=1016
子類建構函式c=1116
子類重寫父類的私有普通方法c=1616
子類寫一個和父類名字一樣的靜態方法c=2116

3. 結果分析

1. 若存在繼承關係,而且父類和子類中都存在靜態程式碼塊、靜態變數、構造程式碼塊、構造方法
2. 先是父類靜態程式碼塊和靜態變數,靜態程式碼塊和靜態變數的初始化順序 是誰在前誰先載入
3. 再是子類靜態程式碼塊和靜態變數,靜態程式碼塊和靜態變數的初始化順序 是誰在前誰先載入
4. 再是父類構造程式碼塊,父類構造方法
5. 再是子類構造程式碼塊,父類構造方法

4. 繼承父類方法引發的問題

1. 子類只能重寫父類的普通而且是public方法,私有方法不能重寫
2.重寫的方法也只是再呼叫的時候才能執行
3.怎麼判斷子類是不是能重寫父類的方法,用一個@Override即可判斷,如果一個方法上不能加@Override說明不能重寫
##### 4. 父類的靜態方法可以被子類繼承,但是不能重寫,或者說不能叫重寫,如果在子類上寫一個和父類名字相同的靜態方法,新增@Override就會報錯,網上關於父類靜態方法能不能被子類重寫的討論有很多,這裡我摘抄一部分,下面展示

5. 討論

1.靜態方法屬於靜態繫結,在編譯階段已經確定函式名和地址,
靜態方法當然是可以被繼承的,但是卻不能被重寫,為什麼那?
因為重寫的意思是重新定義父類的虛擬函式,但是虛擬函式是動態繫結的,而靜態方法是靜態繫結的,
所以靜態函式必然不能是虛擬函式,也就不存在所說的重寫了.你在子類中重新寫一個同名的函式,
覆蓋了父類的同名函式,在使用子類指標進行呼叫的時候,呼叫的就是子類的這個靜態方法
2.如果不是在這個父類也不是子類中,而是在另外一個類中呼叫的時候,是需要匯入類的,
你匯入的是什麼類,他就會引入哪個類,進而呼叫父類或者子類的方法
import static parent.Child.staticMethod;
public class Ther {
    public static void main(String[] args) {
        staticMethod();//輸出的是子類的結果
    }
}
import static parent.Father.staticMethod;

public class Ther {
    public static void main(String[] args) {
        staticMethod();//輸出的是父類的結果
    }
}
3. 但是在一個父類或者子類的Main方法中,預設呼叫的是自己的,當前是父類,輸出的就是父類的
當前是子類,輸出的結果就是子類的