我是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
答案 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;
}