2017-03-09 45 views
-3
public class StaticTest { 

    public static int k = 0; 
    public static StaticTest t1 = new StaticTest("t1"); 
    public static StaticTest t2 = new StaticTest("t2"); 
    public static int i = print("i"); 
    public static int n = 99; 
    public int j = print("j"); 

    { 
     print("構造塊"); 
    } 

    static { 
     print("靜態塊"); 
    } 

    public StaticTest(String str) { 
     System.out.println((++k) + ":" + str + " i=" + i + " n=" + n + " this:" + this); 
     ++n; 
     ++i; 
    } 

    public static int print(String str) { 
     System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); 
     ++i; 
     return ++n; 
    } 

    public static void main(String[] args) { 
     new StaticTest("init"); 
    } 
} 

源代碼的靜態塊如上述,我知道類的加載順序,這是靜態變量>>代碼的靜態塊>>成員變量>> >>碼構造方法的構造塊。什麼我感到困惑的是,當爲什麼在加載這種類型的靜態變量不需要調用代碼

公共靜態StaticTest T1 =新StaticTest( 「T1」);

執行時,爲什麼的碼中的靜態塊(

靜態{ 打印( 「靜態塊」); }

)不運行,但

public int j = print(「j」);

跑?它發生了什麼?我希望你能告訴我一些事情,我會很感激的。

+0

靜態變量被初始化,所以在構造將要運行。你期望會發生什麼? – Kayaman

+1

你可以簡化*這段代碼來明確你想要展示的一件事,並且指定你看到的確切輸出嗎? – David

+0

你確定你在這裏發佈的確切代碼實際編譯了嗎? –

回答

0

你不做static call那裏。 new Object()「方法」調用constructor,永遠不會是static。從程序

0

輸出:

1:j i=0 n=0 
2:構造塊 i=1 n=1 
3:t1 i=2 n=2 this:[email protected] 
4:j i=3 n=3 
5:構造塊 i=4 n=4 
6:t2 i=5 n=5 this:[email protected] 
7:i i=6 n=6 
8:靜態塊 i=7 n=99 
9:j i=8 n=100 
10:構造塊 i=9 n=101 
11:init i=10 n=102 this:[email protected] 

你是正確的Java踏上第一個做靜態初始化,從頂部,調用main方法之前。事情變得有點複雜,當你做

public static StaticTest t1 = new StaticTest("t1"); 

在這一點上,即使靜態initializtions是不完整的,在t1實例的創建開始。我認爲我永遠不會依賴像我這樣的代碼工作。無論如何,構建t1涉及初始化j並運行非靜態初始化塊(print("構造塊");)和構造函數;這會在輸出中產生第1到第3行。的t2建設產生線4至6

靜態初始化與i(第7行),n然後靜態初始化塊(第8行)繼續。

最後main()被調用時,創建一個多個對象,這反過來又使您線9至11

+0

是的,我明白了你的觀點,並且我意識到,當創建一個帶有StaticTest.JVM實例的靜態變量將爲堆分配空間時,JVM如何知道要分配多大的空間?有一個假設,我只有成員變量會被分配空間(靜態變量和靜態代碼塊在方法區分配空間),所以靜態代碼塊不會在** t1 **實例化後調用,而不是* * public int j = print(「j」)**跑了,對嗎? –

+0

我想到它的方式:靜態變量在類被加載時被分配一次(可能還有更多需要說明的地方)。只有實例變量用'new'分配,並且在編譯時已經決定了爲它們分配多少空間。 –

+0

靜態成員變量可以分配'new'對象。爲什麼不? –

相關問題