2012-09-09 418 views

回答

8

嘗試:

Node(K data) 
    { 
     this(); 
     this.data = data; 

    } 

到 「其他」 構造函數的調用必須始終第一。從構造函數中調用其他構造函數總是使用this(...)而不是Node(...)

JLS section 8.8.7指定構造體應如何看起來像:

ConstructorBody:{ExplicitConstructorInvocation(OPT) BlockStatements(OPT) }

其中ExplicitConstructorInvocation(opt)或者是一個可選的構造或構造來自用super(...)調用的父類。

JLS section 12.5指定當一個構造函數被調用對象的初始化步驟:

到新創建的對象的引用被返回的結果只是前,表明構造處理使用初始化新對象以下過程:

  • 將構造函數的參數分配給此構造函數調用的新創建的參數變量。

  • 如果此構造函數以相同類中另一個構造函數的顯式構造函數調用(第8.8.7.1節)開頭(使用此參數),則計算參數並使用這五個相同的步驟來遞歸構造函數調用。

...

這些JLS規則確保父類的構造被稱爲第一和一次。

+0

1+,但是隻有在你的編輯解釋你的代碼正在做什麼之後。 –

+0

爲什麼它必須是第一個? – Phoenix

+0

構造函數體的結構和構造的初始化步驟由java語言規範定義。用參考更新了答案。 – dcernahoschi

6

只能調用另一個構造函數作爲當前構造函數的第一條語句。

移動this.data = data;低於this()

+1

'this.Node ()'=>'this()' – assylias

2

爲了調用內另外一個構造函數:

  1. 您必須this(args)調用它。
  2. 您必須將其作爲構造函數中的第一條語句調用。

    Node(K data) { 
        this(); 
        this.data = data; 
    } 
    
0

當我需要創造更多的構造函數,我做這種方式(假設,該組參數只會擴大,並不能完全改變):

public class Foo 
{ 
    private static final int DEFAULT_SECOND = ...; 
    private static final int DEFAULT_FIRST = ...; 

    //Constructor with the biggest attribute set 
    public Foo(int first, int second) 
    { 
     //do the actual initialization 
    } 

    public Foo(int first) 
    { 
     this(first, DEFAULT_SECOND); 
    } 

    public Foo() 
    { 
     this(DEFAULT_FIRST, DEFAULT_SECOND); 
    } 
} 
相關問題