2015-10-20 77 views
2

我喜歡這個 -主要方法執行而不執行靜態塊

class A { 
    static { 
     A obj = new A(); 
    } 
    int x = 0; 

    public A() {} 

    public static int square(int x) { 
     return x * x; 
    } 
    public static void main(String[] args) { 
     //A obj = new A(); 
     System.out.println("Hello World!" + square(4)); 
    } 
} 

一類這個代碼給StackOverFlowException如果我們main方法創建一個新的對象,如鯁在無限循環的代碼。對於靜態塊也應該如此。但給代碼編譯和運行良好。誰能解釋這種行爲?

+0

爲什麼即使你創建一個新的對象? – SacJn

+1

創建一個新的對象不會在這裏導致一個'StackOverFlowException'。這一定是其他原因造成的。 – Paul

+0

當類由ClassLoader加載時,靜態塊將只執行一次。 – jgitter

回答

0

在靜態塊內移動A obj = new A();將導致A對象僅被創建一次。這是因爲您的默認構造函數爲空,它不會調用創建其他對象。 如果你的構造包含調用創建另一個對象,它將遞歸調用進一步對象的創建

第一種情況: -

static { 
     A obj = new A(); 
    } 
    int x = 0; 

    public A() {} ///// gets executed due to static initalizer and stops there. 

第二種情況: -

public A() { 

    A obj = new A(); 
} ///// recursively calls Objects resulting in `StackOverFlowException` 
0

如果我不得不猜測,你已經這樣編寫你的程序:

public A() 
{ 
    A obj = new A(); 
} 

而且您還沒有正確地將您的代碼複製到此問題。

無論如何,上面這段代碼會在構造函數中創建一個新實例,導致一連串永不結束的調用,最終會填滿可用的堆棧空間並導致堆棧溢出異常。這與靜態塊無關。