以下代码显示第4行
时的错误class MyClass{
public MyClass(int a){ } //Line 2
public static void main(String a[]){
MyClass n = new MyClass(); //Line 4
System.out.print("TRUE");
}
}
但是,一旦我删除第2行,它就会运行而没有任何错误。虽然,我没有添加默认构造函数。为什么?
答案 0 :(得分:4)
请注意,只有在您没有提供任何明确的构造函数的情况下,Compiler
才会为您的类提供default constructor
。一旦声明了自己的构造函数,参数化或0-arg,编译器就不会给你默认的构造函数。
现在在你的代码中,你已经声明了一个参数化的构造函数,编译器不会给出一个默认的构造函数。所以,你实际上没有任何0-arg构造函数,因此你不能使用它。
一旦删除第2行,它就会运行而没有任何错误。虽然,我没有 添加默认构造函数。为什么?
当然如果删除第2行,那么你还没有声明任何显式构造函数,在这种情况下, Compiler 会添加一个默认的0-arg构造函数,因此你的代码成功了。另请注意,默认构造函数是编译器提供的构造函数。当您声明 0-arg构造函数时,它不会被称为默认,而只是 0-arg构造函数。
因此,无论何时声明参数化构造函数,请确保明确声明0-arg constructor
,如果您正在使用它。
public MyClass() {
}
答案 1 :(得分:2)
每个类都有一个隐式默认构造函数,它不带参数。但是,当您使用args声明构造函数时,将省略默认构造函数。因此
MyClass n = new MyClass();
将无法编译。
请注意,一个类可以有多个构造函数,如果您有其他构造函数,则可以显式声明默认的无参数构造函数 。 e.g。
class MyClass{
public MyClass(int a){ }
public MyClass(String a){ }
public MyClass(){ } // no-arg declaration now required
}
答案 2 :(得分:0)
那是因为一旦你用参数声明了一个构造函数,那么没有参数的默认构造函数就不再可用了。
答案 3 :(得分:0)
在您的类中缺少默认构造函数,它只包含参数化构造函数。但是您正在使用默认构造函数进行初始化。所以你会在第4行得到错误。 在您的代码中添加默认构造函数作为打击
作为具有默认构造函数MyClass n = new MyClass();
的创建对象,您的代码应具有默认构造函数。
public MyClass(){ }
现在它可以解决任何错误。
如果您想使用参数化构造函数,请按以下方式创建对象。
MyClass n = new MyClass(pass parameter here);
答案 4 :(得分:0)
如果您没有在类中定义构造函数,则 仅 编译器将自动插入默认构造函数(no-args)
阅读http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
答案 5 :(得分:0)
创建参数化构造函数时,除非您创建自己的默认构造函数,否则将删除默认构造函数。
因此你必须创建如下的构造函数。
public MyClass(){}