java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序判斷
前言
靜態(tài)代碼優(yōu)先于非靜態(tài)的代碼,是因為被static修飾的成員都是類成員,會隨著JVM加載類的時候加載而執(zhí)行,而沒有被static修飾的成員也被稱為實例成員,需要創(chuàng)建對象才會隨之加載到堆內(nèi)存。所以靜態(tài)的會優(yōu)先非靜態(tài)的。
執(zhí)行構(gòu)造器(構(gòu)造方法)的時候,在執(zhí)行方法體之前存在隱式三步:
1,super語句,可能出現(xiàn)以下三種情況:
1)構(gòu)造方法體的第一行是this語句,則不會執(zhí)行隱式三步,
2)構(gòu)造方法體的第一行是super語句,則調(diào)用相應(yīng)的父類的構(gòu)造方法,
3)構(gòu)造方法體的第一行既不是this語句也不是super語句,則隱式調(diào)用super(),即其父類的默認構(gòu)造方法,這也是為什么一個父類通常要提供默認構(gòu)造方法的原因;
2,初始化非靜態(tài)變量;
3,構(gòu)造代碼塊。
由此可知,構(gòu)造代碼塊優(yōu)先于構(gòu)造方法的方法體,但是this關(guān)鍵字跟super關(guān)鍵字不能同時出現(xiàn),而且只能在代碼的第一行。如果出現(xiàn)了this關(guān)鍵字,隱式三步就不會執(zhí)行。
先看看下面幾個類,然后判斷它們的輸出:
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();
}
}
父類與子類執(zhí)行的先后順序
靜態(tài)變量的執(zhí)行特性
方法重寫(override)的注意事項
1.當父類與子類都有靜態(tài)代碼塊和構(gòu)造函數(shù)的時候,執(zhí)行順序如下:
父類靜態(tài)代碼塊 > 子類靜態(tài)代碼塊
父類構(gòu)造函數(shù) > 子類構(gòu)造函數(shù)(先有父親,后有孩子)
如果是多級繼承關(guān)系的話,最高層的父類首先執(zhí)行,然后依次遞減
總結(jié):靜態(tài)優(yōu)先執(zhí)行,父類優(yōu)先執(zhí)行
注意:靜態(tài)代碼塊是在JVM加載類的時候執(zhí)行的,而且靜態(tài)代碼塊執(zhí)行且僅執(zhí)行一次
2.在調(diào)用類中的方法時,在方法體執(zhí)行之前,首先要對類中的成員變量進行賦值,如果代碼中沒有賦具體的值,也有默認值。成員變量的賦值順序按照前后順序進行。
如果有既有直接賦值,也有構(gòu)造方法賦值,那么根據(jù)先后順序執(zhí)行
3.重寫(Override) 重載(Overload)
重載是方法名字,返回類型一致,唯一不同的是方法的參數(shù)不同(參數(shù)類型不同,或者參數(shù)類型不同)
重寫:
- 發(fā)生方法重寫的兩個方法返回值,方法名,參數(shù)列表必須完全一致
- 子類拋出的異常不能超過父類相應(yīng)的方法拋出的異常
- 子類方法的訪問級別不能低于父類相應(yīng)方法的訪問級別(public,package,protected, private)
多態(tài):
父類的引用指向了子類的對象,調(diào)用時執(zhí)行的方法也是子類的方法,父類的方法并不會被執(zhí)行,
所謂多態(tài)就是父類或者接口類型的引用可以指向子類或者實現(xiàn)該接口的類的實例(對象),
看了上面的說明,大家也應(yīng)該知道上面的程序輸出結(jié)果了。
輸出結(jié)果為:1a2b2b
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
SpringBoot+Redission實現(xiàn)排行榜功能的示例代碼
這篇文章主要介紹了基于SpringBoot+Redission實現(xiàn)排行榜功能,實現(xiàn)一個排行榜,要求按照分數(shù)和達成這個分數(shù)的時間排序,即相同分數(shù)下,時間早的在上面,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下2024-05-05
Spring?AOP?后置通知修改響應(yīng)httpstatus方式
這篇文章主要介紹了Spring?AOP?后置通知修改響應(yīng)httpstatus方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
postman測試傳入List<String>參數(shù)方式
這篇文章主要介紹了postman測試傳入List<String>參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
JPA中@CreatedDate和@LastModifiedDate的使用方式
這篇文章主要介紹了JPA中@CreatedDate和@LastModifiedDate的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
使用java + selenium + OpenCV破解騰訊防水墻滑動驗證碼功能
這篇文章主要介紹了使用java + selenium + OpenCV破解騰訊防水墻滑動驗證碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
Java連接Oracle數(shù)據(jù)庫完整步驟記錄
數(shù)據(jù)庫的操作是當前系統(tǒng)開發(fā)必不可少的開發(fā)部分之一,下面這篇文章主要給大家介紹了關(guān)于Java連接Oracle數(shù)據(jù)庫的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-01-01

