声明和调用构造函数

时间:2012-11-28 17:33:18

标签: java constructor

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

6 个答案:

答案 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(){}