1

下面的代码在第 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 行,它就会运行没有任何错误。虽然,我没有添加默认构造函数。为什么 ?

4

6 回答 6

4

请记住,只有在您没有给出任何显式构造函数的情况下,才会Compiler为您的类提供 a 。default constructor一旦您声明了自己的构造函数,参数化或 0-arg,编译器就不会为您提供默认构造函数。

现在在您的代码中,您已经声明了一个参数化构造函数,编译器不会给出默认构造函数。因此,您实际上没有任何 0-arg 构造函数,因此您不能使用它。

一旦我删除第 2 行,它运行没有任何错误。虽然,我没有添加默认构造函数。为什么 ?

当然,如果您删除第 2 行,那么您还没有声明任何显式构造函数,在这种情况下,编译器会添加一个默认的 0-arg 构造函数,因此您的代码会成功。另请注意,默认构造函数是编译器提供的。当您声明0-arg 构造函数时,它不称为默认构造函数,而只是一个0-arg 构造函数

因此,每当您声明参数化构造函数时,请确保您还0-arg constructor显式声明了一个,如果您当然正在使用它。

public MyClass() {
}
于 2012-11-28T17:34:19.893 回答
2

每个类都有一个不带参数的隐式默认构造函数。但是,当您使用 args 声明构造函数时,会省略默认构造函数。因此

MyClass n = new MyClass();

将无法编译。

请注意,一个类可以有多个构造函数,如果您有其他构造函数,则可以显式声明默认的无参数构造函数。例如

class MyClass{
    public MyClass(int a){ } 
    public MyClass(String a){ } 
    public MyClass(){ }  // no-arg declaration now required
}
于 2012-11-28T17:34:53.637 回答
0

那是因为一旦你声明了一个带参数的构造函数,没有参数的默认构造函数就不再可用了。

于 2012-11-28T17:35:09.767 回答
0

在您的类中缺少默认构造函数,它仅包含参数化构造函数。但是您正在使用默认构造函数进行初始化。所以你会在第 4 行得到错误。在你的代码中添加默认构造函数作为打击

作为您使用默认构造函数创建对象,MyClass n = new MyClass(); 您的代码应该具有默认构造函数。

public MyClass(){ }

现在它可以正常工作了。

如果您想使用参数化构造函数,请按如下方式创建对象。

MyClass n = new MyClass(pass parameter here); 
于 2012-11-28T17:37:23.403 回答
0

如果您没有在类中定义构造函数,则只有编译器会自动插入默认构造函数(无参数)
阅读http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html的最后一段

于 2012-11-28T17:44:42.490 回答
0

当您创建参数化 cunstructor 时,默认构造函数将被删除,除非您创建自己的默认构造函数。

因此,您必须如下创建构造函数。

public MyClass(){}
于 2012-11-28T17:47:31.367 回答