前言
靜態代碼優先于非靜態的代碼,是因為被static修飾的成員都是類成員,會隨著JVM加載類的時候加載而執行,而沒有被static修飾的成員也被稱為實例成員,需要創建對象才會隨之加載到堆內存。所以靜態的會優先非靜態的。
執行構造器(構造方法)的時候,在執行方法體之前存在隱式三步:
1,super語句,可能出現以下三種情況:
1)構造方法體的第一行是this語句,則不會執行隱式三步,
2)構造方法體的第一行是super語句,則調用相應的父類的構造方法,
3)構造方法體的第一行既不是this語句也不是super語句,則隱式調用super(),即其父類的默認構造方法,這也是為什么一個父類通常要提供默認構造方法的原因;
2,初始化非靜態變量;
3,構造代碼塊。
由此可知,構造代碼塊優先于構造方法的方法體,但是this關鍵字跟super關鍵字不能同時出現,而且只能在代碼的第一行。如果出現了this關鍵字,隱式三步就不會執行。
先看看下面幾個類,然后判斷它們的輸出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class A { static { System.out.print( 1 ); } public A(){ System.out.print( 2 ); } } public class B extends A{ static { System.out.print( "a" ); } public B(){ System.out.print( "b" ); } } public class C { public static void main(String[] args){ A a = new B(); a = new B(); } } |
父類與子類執行的先后順序
靜態變量的執行特性
方法重寫(override)的注意事項
1.當父類與子類都有靜態代碼塊和構造函數的時候,執行順序如下:
父類靜態代碼塊 > 子類靜態代碼塊
父類構造函數 > 子類構造函數(先有父親,后有孩子)
如果是多級繼承關系的話,最高層的父類首先執行,然后依次遞減
總結:靜態優先執行,父類優先執行
注意:靜態代碼塊是在JVM加載類的時候執行的,而且靜態代碼塊執行且僅執行一次
2.在調用類中的方法時,在方法體執行之前,首先要對類中的成員變量進行賦值,如果代碼中沒有賦具體的值,也有默認值。成員變量的賦值順序按照前后順序進行。
如果有既有直接賦值,也有構造方法賦值,那么根據先后順序執行
3.重寫(Override) 重載(Overload)
重載是方法名字,返回類型一致,唯一不同的是方法的參數不同(參數類型不同,或者參數類型不同)
重寫:
- 發生方法重寫的兩個方法返回值,方法名,參數列表必須完全一致
- 子類拋出的異常不能超過父類相應的方法拋出的異常
- 子類方法的訪問級別不能低于父類相應方法的訪問級別(public,package,protected, private)
多態:
父類的引用指向了子類的對象,調用時執行的方法也是子類的方法,父類的方法并不會被執行,
所謂多態就是父類或者接口類型的引用可以指向子類或者實現該接口的類的實例(對象),
看了上面的說明,大家也應該知道上面的程序輸出結果了。
輸出結果為:1a2b2b
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://segmentfault.com/a/1190000012323629