問題一:如下**的執行順序是什麼樣的!一定理解:是執行的順序(後面會給大家說乙個誤區)!
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 靜態變數或靜態方法...