初学者Q:Java中的可选参数

时间:2017-05-25 19:21:23

标签: java constructor optional-parameters

我是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

(好奇,我只是从C ++中翻译一个超级简单的DSMC代码......)。

我错过了什么愚蠢的事情?

感谢。 -Peter

2 个答案:

答案 0 :(得分:3)

这不是构造函数,它们是常规方法:

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

通过删除返回类型将它们更改为构造函数:

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

由于您没有在sortList类中声明任何构造函数(您刚刚声明了两个与该类具有相同名称的常规方法),因此只有默认的无参数构造函数可用。

答案 1 :(得分: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");
   }
}

所有已定义的构造函数都隐式调用super();。所以Test2构造函数实际上看起来像这样:

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