淺談Java變量的初始化順序詳解
規(guī)則1(無繼承情況下):
對于靜態(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)造器");
}
}//如果你想把這兩個類放在同一個文件且名字起為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)初始化塊是依照他們在類中的定義順序進行初始化的。同樣,變量和初
始化塊也遵循這個規(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
個人總結(jié):
先靜后動,先父后子,從上到下,先變量后構(gòu)造
相關(guān)文章
Java實現(xiàn)駝峰下劃線互轉(zhuǎn)的使用示例
駝峰和下劃線互轉(zhuǎn)場景是在不同命名規(guī)范的情況下,需要進行字段名稱的轉(zhuǎn)換,本文就來介紹一下Java實現(xiàn)駝峰下劃線互轉(zhuǎn)的使用示例,感興趣的可以了解一下2023-12-12深入理解JavaWeb中過濾器與監(jiān)聽器的應(yīng)用
這篇文章主要介紹了JavaWeb中過濾器與監(jiān)聽器的應(yīng)用,過濾器能夠?qū)ζヅ涞恼埱蟮竭_目標之前或返回響應(yīng)之后增加一些處理代碼,監(jiān)聽器是一個接口內(nèi)容由我們實現(xiàn),會在特定時間被調(diào)用,感興趣想要詳細了解可以參考下文2023-05-05Spring?Cloud?整合?nacos實現(xiàn)動態(tài)配置中心的詳細步驟
這篇文章主要介紹了Spring?Cloud?整合?nacos?實現(xiàn)動態(tài)配置中心,整合步驟是通過添加依賴新建nacos配置,本文分步驟通過實例代碼給大家詳細講解,需要的朋友可以參考下2022-10-10SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動態(tài)表名操作
這篇文章主要介紹了SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動態(tài)表名,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12Mybatis如何按順序查詢出對應(yīng)的數(shù)據(jù)字段
這篇文章主要介紹了Mybatis如何按順序查詢出對應(yīng)的數(shù)據(jù)字段,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Spring Boot 中application.yml與bootstrap.yml的區(qū)別
其實yml和properties文件是一樣的原理,且一個項目上要么yml或者properties,二選一的存在。這篇文章給大家介紹了Spring Boot 中application.yml與bootstrap.yml的區(qū)別,感興趣的朋友一起看看吧2018-04-04SpringBoot多數(shù)據(jù)源切換實現(xiàn)代碼(Mybaitis)
實際工作中我們會遇到springboot項目初始化啟動時候,不能指定具體連接哪個數(shù)據(jù)源的時候,不同的接口連接不同的數(shù)據(jù)源或者前端頁面指定連接某個數(shù)據(jù)源等等情況,就會遇到動態(tài)數(shù)據(jù)源切換的問題,需要的朋友可以參考下2022-04-04