2012-02-15 59 views
0
class Size{ 
Size(){ 

} 
//public final Size SMALL = new Size();//infinite loop 
    final Size as = new Size();//infinite loop 
//static Size aw = new Size();//No infinte loop 

} 


class b{ 

static public void main(String ftr[]){ 

    Size z = new Size(); 

    } 
} 

當靜態尺寸aw等於新Size();上述程序運行時出現錯誤。 看到的場景之下,該程序與運行時:請在初始化java類的同時初始化以下內容

public final Size SMALL = new Size();// infinite loop is happening 
    final Size as = new Size(); 

一個無限循環的發生,節目是給

Exception in thread "main" java.lang.StackOverflowError 
    at Size.<init>(Interesting.java:6) 
    at Size.<init>(Interesting.java:6) 

誰能給我解釋一下,或者指向我的地方,我可以找到背後的原因。

回答

2

因爲as在第6行是實例屬性(對象的一部分),所以你可以像閱讀這樣的:

要創建這個對象我必須首先創建類型大小的這個對象,而是創建一個對象我必須先創建類型大小的物體,而是創造...

因此無限循環。

在當你與static預選賽標記它的ohter手,你讓一個類屬性(類不是對象的一部分),所以你可以看它喜歡。

要定義這個類,我要創建類型大小

那麼Java說......「好,我知道,我會那麼時間來辦」的這個對象。類定義被創建,並且當被加載時創建該類的新實例。不會出現混亂或無限循環。

我希望這會有所幫助。

6
final Size as = new Size(); 

as是一個實例變量,所以Size每個實例有它。的Size構造函數調用as = new Size(),從而創造Size一個新的實例,這反過來也將開始構造並調用as = new Size() ....導致無限遞歸構造invokations。

這裏主要的一點是要注意的是,由於as是一個實例變量,每次創建一個對象 - 它是在構造函數初始化。

你可能想使as類變量,通過聲明它static。這將導致的as初始化只發生一次,防止無限的構造invokation。

0

靜態=在整個應用程序一個對象,因此它被創建一次,僅此而已。 非靜態=創建每個對象的一個​​實例,有多少個對象在創建?那麼你創建z和那裏面±您創建一個新的z,創建一個新的z ....