Java子類繼承父類,類的載入順序,看著一篇就夠了
阿新 • • 發佈:2018-12-17
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方法中,預設呼叫的是自己的,當前是父類,輸出的就是父類的
當前是子類,輸出的結果就是子類的