2017-05-25 80 views
1

我完全不熟悉Java,就像我昨天開始的那樣。初學者Q:Java中的可選參數

我有一個類,我想有兩個構造函數:一個沒有參數,一個。

按說這應該是簡單的:

public class sortList { 

    public int ncell, npart, cell_n, index, Xref; 

    // constructor(s):                                    

    public void sortList() {                                  
     initLists(1, 1); 
    } 

    public void sortList(int ncell_in, int npart_in) { 
     initLists(ncell_in, npart_in); 
    }  

    private void initLists(int ncell_in, int npart_in) { 
     /* DO STUFF */ 
    } 
} 

當我把這個從我的main()雖然:

sortList mySL = new sortList(5, 6); 

... java的抱怨:

寫兩種方法重載的構造
myDSMC.java:5: error: constructor sortList in class sortList cannot be applied to given types; 
      sortList mySL = new sortList(5, 6); 
         ^ required: no arguments  
found: int,int  
reason: actual and formal argument lists differ in length 
1 error 

(對於好奇心,我只是翻譯了一個超級簡單的DSMC代碼從C++ ...)。

我錯過了什麼愚蠢的東西?

謝謝。 -Peter

+0

備註:Java的近似通用風格的一部分是**以大寫字母**開頭的類名。您的構造函數與您的類具有相同的名稱,並且也將被大寫。所有其他方法都以小寫字母開頭。 –

回答

3

這不是構造函數,它們是常規方法:

public void sortList() {...} 
public void sortList(int ncell_in, int npart_in) {...} 

通過除去返回類型改變他們的構造函數:

public sortList() {...} 
public sortList(int ncell_in, int npart_in) {...} 

既然你沒有宣佈任何構造您的sortList類(您只聲明瞭兩個與該類名稱相同的常規方法),則只有默認的無參數構造函數可用。

+0

明白了!很棒。萬分感謝。 – mrentropy

1

Java中的構造函數沒有返回類型,並且名稱與該類的名稱相同。 java中的所有方法都有返回類型(void - 如果沒有返回)。 您不必爲您的課程提供任何構造函數,但在執行此操作時必須小心。編譯器自動爲任何沒有構造函數的類提供一個無參數的默認構造函數。這個默認構造函數將調用超類的無參構造函數。在這種情況下,如果超類沒有無參數構造函數,編譯器會發出抱怨,因此您必須驗證它是否存在。如果你的類沒有顯式超類,那麼它有一個隱式超類Object,它有一個無參構造函數。的構造和方法

實施例:

// for this class default no-args constructor implicitly created 
public class Test1 { 
    int id; 

    // regular method 
    public int getId() { 
     return id; 
    } 

    // regular method 
    public int test1() { 
     return 1; 
    } 
} 


public class Test2 { 

    int id; 

    // no-args constructor 
    public Test2() { 
    } 

    // overloaded constructor 
    public Test2(int id) { 
     this.id = id; 
    } 

    // regular method 
    public int getId() { 
     return id; 
    } 

    // regular method 
    public void test2() { 
     System.out.println("1"); 
    } 
} 

所有定義的構造隱式調用​​。所以Test2的構造函數看起來像這樣:

public Test2(int id) { 
     super(); 
     this.id = id; 
    }