淺談Java變量的初始化順序詳解
規(guī)則1(無(wú)繼承情況下):
對(duì)于靜態(tài)變量、靜態(tài)初始化塊、變量、初始化塊、構(gòu)造器,它們的初始化順序依次是
(靜態(tài)變量、靜態(tài)初始化塊)>(變量、初始化塊)>構(gòu)造器
證明代碼:
public class InitialOrderTest {
// 靜態(tài)變量
public static String staticField = "靜態(tài)變量";
// 變量
public String field = "變量";
// 靜態(tài)初始化塊
static {
System.out.println(staticField);
System.out.println("靜態(tài)初始化塊");
}
// 初始化塊
{
System.out.println(field);
System.out.println("初始化塊");
}
// 構(gòu)造器
public InitialOrderTest() {
System.out.println("構(gòu)造器");
}
public static void main(String[] args) {
new InitialOrderTest();
}
}
結(jié)果顯示:
靜態(tài)變量
靜態(tài)初始化塊
變量
初始化塊
構(gòu)造器
規(guī)則2(有繼承情況下):
子類的靜態(tài)變量和靜態(tài)初始化塊的初始化是在父類的變量、初始化塊和構(gòu)造器初始化之前就完成
class Parent {
// 靜態(tài)變量
public static String p_StaticField = "父類--靜態(tài)變量";
// 變量
public String p_Field = "父類--變量";
// 靜態(tài)初始化塊
static {
System.out.println(p_StaticField);
System.out.println("父類--靜態(tài)初始化塊");
}
// 初始化塊
{
System.out.println(p_Field);
System.out.println("父類--初始化塊");
}
// 構(gòu)造器
public Parent() {
System.out.println("父類--構(gòu)造器");
}
}//如果你想把這兩個(gè)類放在同一個(gè)文件且名字起為SubClass, 父類前不能加public
public class SubClass extends Parent {
// 靜態(tài)變量
public static String s_StaticField = "子類--靜態(tài)變量";
// 變量
public String s_Field = "子類--變量";
// 靜態(tài)初始化塊
static {
System.out.println(s_StaticField);
System.out.println("子類--靜態(tài)初始化塊");
}
// 初始化塊
{
System.out.println(s_Field);
System.out.println("子類--初始化塊");
}
// 構(gòu)造器
public SubClass() {
System.out.println("子類--構(gòu)造器");
}
// 程序入口
public static void main(String[] args) {
new SubClass();
}
}
結(jié)果顯示:
父類--靜態(tài)變量
父類--靜態(tài)初始化塊
子類--靜態(tài)變量
子類--靜態(tài)初始化塊
父類--變量
父類--初始化塊
父類--構(gòu)造器
子類--變量
子類--初始化塊
子類--構(gòu)造器
規(guī)則2(靜態(tài)變量和靜態(tài)初始化塊):
靜態(tài)變量和靜態(tài)初始化塊是依照他們?cè)陬愔械亩x順序進(jìn)行初始化的。同樣,變量和初
始化塊也遵循這個(gè)規(guī)律。
public class testOrder {
// 靜態(tài)變量
public static TestA a = new TestA();
public TestC c = new TestC();
// 靜態(tài)變量
public static TestB b = new TestB();
public testOrder(){
System.out.println("in constract");
}
// 靜態(tài)初始化塊
static {
System.out.println("靜態(tài)初始化塊");
}
public static void main(String[] args) {
new testOrder();
}
}
class TestA {
public TestA() {
System.out.println("Test--A");
}
}
class TestB {
public TestB() {
System.out.println("Test--B");
}
}
class TestC {
public TestC() {
System.out.println("Test--C");
}
}
結(jié)果顯示:
Test--A
Test--B
靜態(tài)初始化塊
Test--C
in constract
個(gè)人總結(jié):
先靜后動(dòng),先父后子,從上到下,先變量后構(gòu)造
相關(guān)文章
Springboot POI導(dǎo)出Excel(瀏覽器)
這篇文章主要為大家詳細(xì)介紹了Springboot POI導(dǎo)出Excel,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
Java多線程編程之ThreadLocal線程范圍內(nèi)的共享變量
這篇文章主要介紹了Java多線程編程之ThreadLocal線程范圍內(nèi)的共享變量,本文講解了ThreadLocal的作用和目的、ThreadLocal的應(yīng)用場(chǎng)景、ThreadLocal的使用實(shí)例等,需要的朋友可以參考下2015-05-05
SpringMVC多個(gè)模塊404報(bào)錯(cuò)問(wèn)題及解決
這篇文章主要介紹了SpringMVC多個(gè)模塊404報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Springboot整合thymleaf模板引擎過(guò)程解析
這篇文章主要介紹了Springboot整合thymleaf模板引擎過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Spring?循環(huán)依賴之AOP實(shí)現(xiàn)詳情
這篇文章主要介紹了Spring?循環(huán)依賴之AOP實(shí)現(xiàn)詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的盆友可以參考一下2022-07-07
java定時(shí)任務(wù)實(shí)現(xiàn)的4種方式小結(jié)
這篇文章主要介紹了java定時(shí)任務(wù)實(shí)現(xiàn)的4種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
JAVA編程實(shí)現(xiàn)UDP網(wǎng)絡(luò)通訊的方法示例
這篇文章主要介紹了JAVA編程實(shí)現(xiàn)UDP網(wǎng)絡(luò)通訊的方法,簡(jiǎn)單說(shuō)明了UDP通訊的原理并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)UDP通訊的相關(guān)類與使用技巧,需要的朋友可以參考下2017-08-08
Exception in thread main java.lang.NoClassDefFoundError錯(cuò)誤解決方
這篇文章主要介紹了Exception in thread main java.lang.NoClassDefFoundError錯(cuò)誤解決方法,需要的朋友可以參考下2016-08-08
通過(guò)openOffice將office文件轉(zhuǎn)成pdf
這篇文章主要介紹了通過(guò)openOffice將office文件轉(zhuǎn)成pdf,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11

