java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序判斷
前言
靜態(tài)代碼優(yōu)先于非靜態(tài)的代碼,是因?yàn)楸籹tatic修飾的成員都是類成員,會(huì)隨著JVM加載類的時(shí)候加載而執(zhí)行,而沒(méi)有被static修飾的成員也被稱為實(shí)例成員,需要?jiǎng)?chuàng)建對(duì)象才會(huì)隨之加載到堆內(nèi)存。所以靜態(tài)的會(huì)優(yōu)先非靜態(tài)的。
執(zhí)行構(gòu)造器(構(gòu)造方法)的時(shí)候,在執(zhí)行方法體之前存在隱式三步:
1,super語(yǔ)句,可能出現(xiàn)以下三種情況:
1)構(gòu)造方法體的第一行是this語(yǔ)句,則不會(huì)執(zhí)行隱式三步,
2)構(gòu)造方法體的第一行是super語(yǔ)句,則調(diào)用相應(yīng)的父類的構(gòu)造方法,
3)構(gòu)造方法體的第一行既不是this語(yǔ)句也不是super語(yǔ)句,則隱式調(diào)用super(),即其父類的默認(rèn)構(gòu)造方法,這也是為什么一個(gè)父類通常要提供默認(rèn)構(gòu)造方法的原因;
2,初始化非靜態(tài)變量;
3,構(gòu)造代碼塊。
由此可知,構(gòu)造代碼塊優(yōu)先于構(gòu)造方法的方法體,但是this關(guān)鍵字跟super關(guān)鍵字不能同時(shí)出現(xiàn),而且只能在代碼的第一行。如果出現(xiàn)了this關(guān)鍵字,隱式三步就不會(huì)執(zhí)行。
先看看下面幾個(gè)類,然后判斷它們的輸出:
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í)行特性
方法重寫(xiě)(override)的注意事項(xiàng)
1.當(dāng)父類與子類都有靜態(tài)代碼塊和構(gòu)造函數(shù)的時(shí)候,執(zhí)行順序如下:
父類靜態(tài)代碼塊 > 子類靜態(tài)代碼塊
父類構(gòu)造函數(shù) > 子類構(gòu)造函數(shù)(先有父親,后有孩子)
如果是多級(jí)繼承關(guān)系的話,最高層的父類首先執(zhí)行,然后依次遞減
總結(jié):靜態(tài)優(yōu)先執(zhí)行,父類優(yōu)先執(zhí)行
注意:靜態(tài)代碼塊是在JVM加載類的時(shí)候執(zhí)行的,而且靜態(tài)代碼塊執(zhí)行且僅執(zhí)行一次
2.在調(diào)用類中的方法時(shí),在方法體執(zhí)行之前,首先要對(duì)類中的成員變量進(jìn)行賦值,如果代碼中沒(méi)有賦具體的值,也有默認(rèn)值。成員變量的賦值順序按照前后順序進(jìn)行。
如果有既有直接賦值,也有構(gòu)造方法賦值,那么根據(jù)先后順序執(zhí)行
3.重寫(xiě)(Override) 重載(Overload)
重載是方法名字,返回類型一致,唯一不同的是方法的參數(shù)不同(參數(shù)類型不同,或者參數(shù)類型不同)
重寫(xiě):
- 發(fā)生方法重寫(xiě)的兩個(gè)方法返回值,方法名,參數(shù)列表必須完全一致
- 子類拋出的異常不能超過(guò)父類相應(yīng)的方法拋出的異常
- 子類方法的訪問(wèn)級(jí)別不能低于父類相應(yīng)方法的訪問(wèn)級(jí)別(public,package,protected, private)
多態(tài):
父類的引用指向了子類的對(duì)象,調(diào)用時(shí)執(zhí)行的方法也是子類的方法,父類的方法并不會(huì)被執(zhí)行,
所謂多態(tài)就是父類或者接口類型的引用可以指向子類或者實(shí)現(xiàn)該接口的類的實(shí)例(對(duì)象),
看了上面的說(shuō)明,大家也應(yīng)該知道上面的程序輸出結(jié)果了。
輸出結(jié)果為:1a2b2b
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 關(guān)于Java中try finally return語(yǔ)句的執(zhí)行順序淺析
- 淺談Java finally語(yǔ)句到底是在return之前還是之后執(zhí)行(必看篇)
- 談?wù)凧ava中try-catch-finally中的return語(yǔ)句
- Java異常處理中同時(shí)有finally和return語(yǔ)句的執(zhí)行問(wèn)題
- 淺談Java中return和finally的問(wèn)題
- java異常處理執(zhí)行順序詳解try catch finally
- 詳解Java Web項(xiàng)目啟動(dòng)執(zhí)行順序
- 詳解Java中finally和return的執(zhí)行順序
相關(guān)文章
Windows下Java調(diào)用可執(zhí)行文件代碼實(shí)例
這篇文章主要介紹了Windows下Java調(diào)用可執(zhí)行文件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12java多線程關(guān)鍵字final和static詳解
這篇文章主要介紹了java多線程關(guān)鍵字final和static詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01maven插件maven-assembly-plugin打包歸納文件zip/tar使用
java項(xiàng)目運(yùn)行的文件需要jar或者war格式,同時(shí)還需要使用Java命令,本文主要介紹了maven插件maven-assembly-plugin打包歸納文件zip/tar使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02詳解SpringBoot 創(chuàng)建定時(shí)任務(wù)(配合數(shù)據(jù)庫(kù)動(dòng)態(tài)執(zhí)行)
本篇文章主要介紹了SpringBoot 創(chuàng)建定時(shí)任務(wù)(配合數(shù)據(jù)庫(kù)動(dòng)態(tài)執(zhí)行),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Java中的可重入鎖ReentrantLock簡(jiǎn)析
這篇文章主要介紹了Java中的可重入鎖ReentrantLock簡(jiǎn)析,可重入是指同一個(gè)線程如果首次獲得了這把鎖,那么因?yàn)樗沁@把鎖的擁有者,因此有權(quán)利再次獲取這把鎖如果是不可重入鎖,那么第二次獲得鎖時(shí),自己也會(huì)被鎖擋住,需要的朋友可以參考下2023-12-12使用Java對(duì)數(shù)據(jù)庫(kù)進(jìn)行基本的查詢和更新操作
這篇文章主要介紹了使用Java對(duì)數(shù)據(jù)庫(kù)進(jìn)行基本的查詢和更新操作,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10