我真的需要在java中定义默认构造函数吗?

Ayu*_*yal 32 java constructor default-constructor

它在未定义构造函数时工作正常,但如果我定义参数化构造函数而不是默认构造函数并且在创建对象时不传递任何值,则会出错.我认为构造函数是预定义的.

如果我已经定义了参数化构造函数,为什么还需要定义默认构造函数?是不是预定义的默认构造函数?

Jus*_*ini 57

只有在您自己没有定义任何构造函数时,才会自动创建默认(无参数)构造函数.

如果需要两个构造函数,一个带参数,另一个没有,你需要手动定义它们.

  • [链接到文档](https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html):"你不必为你的班级提供任何构造函数,但你必须小心这样做.编译器会自动为没有构造函数的任何类提供一个无参数的默认构造函数.这个默认构造函数将调用超类的无参数构造函数.在这种情况下,如果超类没有一个,那么编译器会抱怨无参数构造函数,所以你必须验证它是否存在." (3认同)

Sah*_*l J 13

虽然上面的所有答案都是正确的,但对于新来者来说,把它包裹起来有点困难.我将尝试为新来者重新回答这个问题.

Ayush面临的问题是尝试Object通过无参数构造函数实例化一个类.但是,该类具有一个或多个参数化构造函数,这会导致编译时错误.

例如,让我们创建一个Student带有单个参数化构造函数的类,并尝试通过no-arg构造函数实例化它.

public class Student {

    private String name;
    private int rollNo;

    public Student(String name, int rollNo) {
        this.name = name;
        this.rollNo = rollNo;
    }

    public static void main(String[] args) {
        // The line below will cause a compile error.
        Student s = new Student();
        // Error will be "The constuctor Student() is undefined"
    }
}
Run Code Online (Sandbox Code Playgroud)

WOHA!但是当我们一起删除public Student(String name, int rollNo) 构造函数时,错误就消失了,代码就会编译完成.

这种看似异常的原因在于,当我们自己没有为该类定义任何构造函数时,Java只为我们提供了默认(无参数)构造函数.

例如,以下类提供了默认的构造函数:

public class Student {
    private String name;
    private int rollNo;
}
Run Code Online (Sandbox Code Playgroud)

变为:

public class Student {

    private String name;
    private int rollNo;

    //Default constructor added by Java.
    public Student() {
        super();
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,在我们定义任何参数化构造函数的那一刻,如果我们想通过no-arg构造函数实例化该类的对象,我们还必须定义一个无参数构造函数.

同样在继承的情况下,没有构造函数的子类; 提供了一个默认构造函数.Java提供的这个默认构造函数调用了超类的无参数构造函数.如果找不到,那么就会抛出错误.

所以是的,定义一个无参数/默认构造函数总是一个不错的选择.

参考:Oracle Java教程


Noo*_*ilk 10

如果您不编写一个no-arg构造函数,则会自动为您插入.这意味着,如果您使用某些参数编写构造函数,它将是您拥有的唯一构造函数,因此您必须为这些参数传递一些值以创建它的实例.