- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java類(lèi)初始化執行流程解析
測試代碼:
package com.test.ClassLaoderTest; public class test1 { public static String s_variable = "靜態(tài)變量"; public String init_variable = "公開(kāi)的變量"; private String p_variable = "私有的變量"; //靜態(tài)代碼塊 static { System.out.println(s_variable); System.out.println("靜態(tài)代碼塊初始化執行了"); } //初始化代碼塊 { System.out.println(init_variable); System.out.println(p_variable); System.out.println("初始化代碼塊執行淪"); } //構造方法 public test1(){ System.out.println("我是構造方法"); } public static void main(String[] args) { } }
直接運行:
main方法里面不做任何調用的情況下,自動(dòng)調用的是靜態(tài)代碼塊和靜態(tài)變量
(2)調用靜態(tài)變量和靜態(tài)方法:
測試代碼:
package com.test.ClassLaoderTest; public class test1 { public static String s_variable = "靜態(tài)變量"; public String init_variable = "公開(kāi)的變量"; private String p_variable = "私有的變量"; //靜態(tài)代碼塊 static { System.out.println(s_variable); System.out.println("靜態(tài)代碼塊初始化執行了"); } //初始化代碼塊 { System.out.println(init_variable); System.out.println(p_variable); System.out.println("初始化代碼塊執行淪"); } //構造方法 public test1(){ System.out.println("我是構造方法"); } //靜態(tài)方法 public static void test1(){ System.out.println("這是靜態(tài)方法"); } public static void main(String[] args) { System.out.println(test1.s_variable); test1.test1(); } }
運行:
結論:當我調用靜態(tài)方法/靜態(tài)變量時(shí),只會(huì )家在靜態(tài)代碼塊,其余的代碼塊/構造方法不會(huì )被加載
(3)創(chuàng )建對象:
package com.test.ClassLaoderTest; public class test1 { public static String s_variable = "靜態(tài)變量"; public String init_variable = "公開(kāi)的變量"; private String p_variable = "私有的變量"; //靜態(tài)代碼塊 static { System.out.println(s_variable); System.out.println("靜態(tài)代碼塊初始化執行了"); } //初始化代碼塊 { System.out.println(init_variable); System.out.println(p_variable); System.out.println("初始化代碼塊執行了"); } //構造方法 public test1(){ System.out.println("我是構造方法"); } //靜態(tài)方法 public static void test1(){ System.out.println("這是靜態(tài)方法"); } public static void main(String[] args) { test1 t1 = new test1(); } }
運行結果:
輸出內容:
靜態(tài)變量
靜態(tài)代碼塊初始化執行了
公開(kāi)的變量
私有的變量
初始化代碼塊執行了
我是構造方法
結論:當創(chuàng )建對象/實(shí)例化的時(shí)候,調用順序:靜態(tài)代碼塊->初始化代碼->構造方法,最后執行的才是構造方法
(4)有繼承關(guān)系下的類(lèi)初始化執行流程:
環(huán)境:
父類(lèi):
package com.test.ClassLaoderTest; public class father { public static String s_variable = "父類(lèi)靜態(tài)變量"; public String init_variable = "父類(lèi)公開(kāi)的變量"; private String p_variable = "父類(lèi)私有的變量"; //父類(lèi)靜態(tài)代碼塊 static { System.out.println(s_variable); System.out.println("父類(lèi)靜態(tài)代碼塊初始化執行了"); } //父類(lèi)初始化代碼塊 { System.out.println(init_variable); System.out.println(p_variable); System.out.println("父類(lèi)初始化代碼塊執行了"); } //構造方法 public father(){ System.out.println("我是父類(lèi)構造方法"); } //父類(lèi)靜態(tài)方法 public static void test1(){ System.out.println("這是父類(lèi)靜態(tài)方法"); } }
test1.java:
繼承其父類(lèi)father:
package com.test.ClassLaoderTest; public class test1 extends father{ public static String s_variable = "子類(lèi)靜態(tài)變量"; public String init_variable = "子類(lèi)公開(kāi)的變量"; private String p_variable = "子類(lèi)私有的變量"; //子類(lèi)靜態(tài)代碼塊 static { System.out.println(s_variable); System.out.println("子類(lèi)靜態(tài)代碼塊初始化執行了"); } //子類(lèi)初始化代碼塊 { System.out.println(init_variable); System.out.println(p_variable); System.out.println("子類(lèi)初始化代碼塊執行了"); } //子類(lèi)構造方法 public test1(){ System.out.println("我是子類(lèi)構造方法"); } //子類(lèi)靜態(tài)方法 public static void test1(){ System.out.println("這是子類(lèi)靜態(tài)方法"); } public static void main(String[] args) { } }
main方法不做任何操作,運行:
只要extends繼承了,優(yōu)先調用父類(lèi)靜態(tài)代碼塊
(5)有繼承關(guān)系下的調用靜態(tài)方法:
修改子類(lèi)即可:
package com.test.ClassLaoderTest; public class test1 extends father{ public static String s_variable = "子類(lèi)靜態(tài)變量"; public String init_variable = "子類(lèi)公開(kāi)的變量"; private String p_variable = "子類(lèi)私有的變量"; //子類(lèi)靜態(tài)代碼塊 static { System.out.println(s_variable); System.out.println("子類(lèi)靜態(tài)代碼塊初始化執行了"); } //子類(lèi)初始化代碼塊 { System.out.println(init_variable); System.out.println(p_variable); System.out.println("子類(lèi)初始化代碼塊執行了"); } //子類(lèi)構造方法 public test1(){ System.out.println("我是子類(lèi)構造方法"); } //子類(lèi)靜態(tài)方法 public static void test1(){ System.out.println("這是子類(lèi)靜態(tài)方法"); } public static void main(String[] args) { test1.test1(); father.test1(); } }
運行:
結果:
父類(lèi)靜態(tài)變量
父類(lèi)靜態(tài)代碼塊初始化執行了
子類(lèi)靜態(tài)變量
子類(lèi)靜態(tài)代碼塊初始化執行了
這是子類(lèi)靜態(tài)方法
這是父類(lèi)靜態(tài)方法
main方法中,誰(shuí)優(yōu)先調用靜態(tài)方法,就優(yōu)先加載誰(shuí)
(6)有繼承關(guān)系下的創(chuàng )建對象:
代碼:
package com.test.ClassLaoderTest; public class test1 extends father{ public static String s_variable = "子類(lèi)靜態(tài)變量"; public String init_variable = "子類(lèi)公開(kāi)的變量"; private String p_variable = "子類(lèi)私有的變量"; //子類(lèi)靜態(tài)代碼塊 static { System.out.println(s_variable); System.out.println("子類(lèi)靜態(tài)代碼塊初始化執行了"); } //子類(lèi)初始化代碼塊 { System.out.println(init_variable); System.out.println(p_variable); System.out.println("子類(lèi)初始化代碼塊執行了"); } //子類(lèi)構造方法 public test1(){ System.out.println("我是子類(lèi)構造方法"); } //子類(lèi)靜態(tài)方法 public static void test1(){ System.out.println("這是子類(lèi)靜態(tài)方法"); } public static void main(String[] args) { test1 t1 =new test1(); } }
運行:
結果:
父類(lèi)靜態(tài)變量
父類(lèi)靜態(tài)代碼塊初始化執行了
子類(lèi)靜態(tài)變量
子類(lèi)靜態(tài)代碼塊初始化執行了
父類(lèi)公開(kāi)的變量
父類(lèi)私有的變量
父類(lèi)初始化代碼塊執行了
我是父類(lèi)構造方法
子類(lèi)公開(kāi)的變量
子類(lèi)私有的變量
子類(lèi)初始化代碼塊執行了
我是子類(lèi)構造方法
結論:通過(guò)結果會(huì )發(fā)現,不管是子類(lèi)還是父類(lèi)靜態(tài)代碼塊,靜態(tài)代碼塊在哪里都是爸爸級別,最先加載的,當創(chuàng )建test1對象的時(shí)候,優(yōu)先加載的是父類(lèi)代碼塊,那么他的初始化執行流程如下:父類(lèi)靜態(tài)代碼塊>子類(lèi)靜態(tài)代碼塊>父類(lèi)初始化代碼塊>父類(lèi)構造方法>子類(lèi)代碼塊>子類(lèi)構造方法
(7) 有繼承關(guān)系下的創(chuàng )建父類(lèi)對象:
package com.test.ClassLaoderTest; public class test1 extends father{ public static String s_variable = "子類(lèi)靜態(tài)變量"; public String init_variable = "子類(lèi)公開(kāi)的變量"; private String p_variable = "子類(lèi)私有的變量"; //子類(lèi)靜態(tài)代碼塊 static { System.out.println(s_variable); System.out.println("子類(lèi)靜態(tài)代碼塊初始化執行了"); } //子類(lèi)初始化代碼塊 { System.out.println(init_variable); System.out.println(p_variable); System.out.println("子類(lèi)初始化代碼塊執行了"); } //子類(lèi)構造方法 public test1(){ System.out.println("我是子類(lèi)構造方法"); } //子類(lèi)靜態(tài)方法 public static void test1(){ System.out.println("這是子類(lèi)靜態(tài)方法"); } public static void main(String[] args) { father father = new father(); } }
運行:
結果:
父類(lèi)靜態(tài)變量
父類(lèi)靜態(tài)代碼塊初始化執行了
子類(lèi)靜態(tài)變量
子類(lèi)靜態(tài)代碼塊初始化執行了
父類(lèi)公開(kāi)的變量
父類(lèi)私有的變量
父類(lèi)初始化代碼塊執行了
我是父類(lèi)構造方法
結論:優(yōu)先執行的是兩個(gè)類(lèi)的靜態(tài)代碼塊,然后是父類(lèi)型的代碼塊和構造方法,而子類(lèi)的代碼塊和構造方法沒(méi)有被執行是因為沒(méi)有實(shí)例化子類(lèi),所以肯定是沒(méi)有他的,那么只有在創(chuàng )建對象的時(shí)候,才會(huì )調用代碼塊和構造方法
到此這篇關(guān)于Java類(lèi)初始化執行流程的文章就介紹到這了,更多相關(guān)Java類(lèi)初始化執行流程內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站