java靜態塊非靜態塊建構函式的初始化順序

2021-09-19 06:37:58 字數 1342 閱讀 7116

public class demo1 

static string name2 = "yhr";

static

public static void main(string args)

}

以下是輸出內容

我是非靜態塊wkwnull

我是建構函式

我是靜態塊yhr

我是非靜態塊wkwyhr

我是建構函式

從輸出可以看出來,類初始化的時候是先載入靜態資源,沒有先後順序,從上到下依次載入,

1.首先載入static demo1 demo1 = new demo1();,執行到這一句的時候會去載入非靜態塊的內容,然後再執行建構函式。這裡其實在編譯成class檔案的時候非靜態的內容是在建構函式上面的,兩個結合了。

demo1()

2這裡還有個需要注意點的是靜態變數name2的宣告放在了非靜態塊的下面,非靜態塊引用了name2,然後執行上面的第乙個靜態變數的時候我當時認為name2還沒有宣告,是怎麼取到值的,後來在class檔案裡面看到name2定義提公升到了方法的前面

static demo1 demo1 = new demo1();

string name1 = "wkw";

static string name2 = "yhr";

而且是先宣告後賦值,所以才有了第乙個輸出name2是null的情況,此時name2還沒有賦值。

為此我專門做了個實驗

public class demo2 

public static void main(string args)

}

結果:

null

anull

anull

c

由於按順序執行變數的初始化,所以變數b初始化的時候呼叫了b()方法,此時a初始化完成,c沒初始化完成,所以b的值是anull,此時執行到b能呼叫c變數說明類初始化的時候是先定義變數,再對變數進行賦值的。

相當於:

string a;

string b;

string c;

3.接下來再執行靜態塊的內容,執行完以後就開始執行非靜態塊,再執行建構函式。

到這裡大家應該清楚他們的執行順序了吧,靜態塊先執行只執行一次,非靜態塊後執行,編譯的時候把非靜態塊的內容放到了建構函式的上面,最後再執行建構函式。

Java 靜態語句塊 語句塊 建構函式

以下是一道筆試題 package com.example public class parent static package com.example public class child extends parent static public static void main string ar...

靜態塊與非靜態塊

在 中,有時候會遇到這種情況,static 以及不帶static的情況 public class staticblock 非靜態塊 public static void main string args 列印出來的結果是 這是靜態塊裡的內容!這是非靜態塊裡的內容!這是非靜態塊裡的內容!這是非靜態塊裡...

構造塊 靜態塊

構造塊 靜態塊 static靜態塊在類載入的時候執行,且只執行一遍。靜態變數也在類載入的時候初始化 public class test public static void main string args 輸出 12 構造塊在類初始化的時候執行 public class test public s...