java中靜態塊,靜態屬性,方法的載入順序

2021-08-27 13:23:50 字數 2261 閱讀 8947

問題一:如下**的執行順序是什麼樣的!一定理解:是執行的順序(後面會給大家說乙個誤區)!

class test

static

public static void main(string args)        }

實際上你現在根本看不出來執行順序,也很容易搞混淆,我們必須找出一種方便的手段去測試一下:

測試的方法:比如

static int num = 4; 這句**,我們怎麼知道他是不是執行了,可以這樣寫 static int num = 4; { system.out.println("執行了靜態變數語句"); } 這樣的話這段**載入的時候,在控制台就能看到,是不是很方便!

接下來我們出發!--------->>

// 注意看,這裡僅僅是乙個普遍情況,特殊情況下面有總結:在下面的a ,b兩種情況的總結非常的重要,一定要好好的看看!

public clas***ten int a = 5; exten() static static void run() // 靜態方法,呼叫的時候才載入// 注意看,e沒有載入 public static void main(string args)

一般順序:靜態塊——>靜態變數——>成員變數——>構造方法——>靜態方法

1、靜態**塊(只載入一次)

2、構造方法(建立乙個例項就載入一次)3、

靜態方法

需要呼叫才會執行,所以最後結果沒有e

想知道順序看看控制台!是不是一目了然了,

問題二:

那麼到這是不是已經完善了呢!請看下面問題很具有迷惑性!

public class staticinittest

public static void main(string args)

} 這是測試截圖,請認真看看

下面按前後順序,分析誰在前,誰在後的執行結果 static 然後到這又把這個s直接列印了出來,列印結果肯定會變成,"我被編譯了" !!

問題:有值就是執行過了嗎?

總結:因為main方法中都是列印語句

,只是在-----列印編譯後載入的值-----而已;

列印不列印,name和s的值都在那裡!注意不注意,name和s都是靜態的!編譯載入而已!

static string s = "靜態string";

static int a = 5;

//還要注意的問題就是,在a中到底有沒有給s賦值,很顯然s的值此時未變,new的時候才執行到,為什麼,請看下面的大總結!

實際上,以上的所有問題加起來就得到的完整的答案,你如果看到了這裡恭喜你,筆者費勁總結的最終的正確的結果就在下面:

先把內在的執行規律簡述:

是不是比較複雜,光看特性就已經複雜了,這裡有些的同學可能就會想了,那這兩個的執行順序是怎麼樣的呢,這裡非常的迷惑人,因為各種情況你得到的測試結果可能都不一樣

不過他們還是有順序的,只不過分情況對待!

大補充:

a、類的

初始化順序如下:

->

1、為靜態屬性分配記憶體並賦值

(後面大括號語句不執行,這裡是初始化,只是新增變數和值) 

或  執行靜態**塊(立刻執行大括號裡面的語句)

為什麼這樣說呢,因為誰在前先載入誰,包括靜態屬性之間,和靜態塊之間的順序,

但是注意,雖然順序都可以當第一,但是靜態塊、靜態屬性執行的東西完全不一樣,怎麼不一樣,已經寫上去了自己看

(筆者注:這個問題,在花了很多時間的推敲後,最終有了答案,前後花了不少的時間去執行**,修改各種情況,也有同學參與了進來,所以大家對我們付出的努力應該尊重啊)

->2、為非靜態屬性分配記憶體並賦值

->3、

構造方法(實際上這個先於非靜態屬性呼叫到,只是構造方法裡面的語句暫停執行,等到非靜態屬性載入完才執行)

->4、

執行非靜態**塊 或 靜態方法

(都是呼叫了才載入)。

b、類的**(大括號內的語句)執行順序:   當你建立了物件的時候才會用到各個屬性和變數對不對,這裡就是這個順序

->1、

執行靜態**塊(大括號包含的語句立刻執行,絕對是第一位的執行,沒有能和它平級的)

->2、

靜態屬性 (第二位執行)

->3、

為非靜態屬性分配記憶體並賦值(大括號內語句第三位執行)

->4、建構函式

->

執行 非靜態**塊 或 靜態方法

(都是呼叫了才載入)。

這樣的話是不是非常的清晰呢了!這才是所有**載入的順序啊,以後對於程式的執行就會有更深的理解了 !

java靜態方法,靜態屬性

靜態方法,靜態屬性,都是不需要建立例項物件就可以呼叫,而且是單例的,不管建立多少個物件,都是共享乙個 靜態屬性。靜態方法不可以呼叫非靜態的變數,只可以呼叫靜態的屬性。靜態方法不可以呼叫非靜態的方法,只可以呼叫靜態的方法 靜態方法和static 塊在類被載入的時候就會被執行!我們定義常量是這樣的 pu...

java中靜態屬性與非靜態屬性

student 類 public class student public student string name public string getname public void setname string name 測試類 public class test 1.靜態的屬性屬於類的,不依賴於...

關於靜態塊 靜態屬性 構造塊 構造方法的執行順序

總結 1 類載入時,執行靜態 塊和初始化靜態變數。執行順序跟 順序一致。2 類例項化時,初始化變數 執行 塊 執行構造。其中初始化變數和 塊的順序跟 順序一致。執行構造是在最後。3 例項化子類時,會先呼叫父類的構造方法。呼叫構造方法之前,會先執行該類的 塊。4 類只會載入一次。5 靜態變數或靜態方法...