2017-05-25 88 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; 
    }