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

2022-09-01 02:50:38

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

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


答案 1

仅当您自己不定义任何构造函数时,才会自动创建默认(无参数)构造函数。

如果需要两个构造函数,一个带参数,一个不带参数,则需要手动定义这两个构造函数。


答案 2

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

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

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

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"
    }
}

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

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

例如,以下类随默认构造函数一起提供:

public class Student {
    private String name;
    private int rollNo;
}

成为:

public class Student {

    private String name;
    private int rollNo;

    //Default constructor added by Java.
    public Student() {
        super();
    }
}

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

同样在继承的情况下,没有构造函数的子类;提供了一个默认构造函数。Java 提供的这个默认构造函数如上所述调用超类的 no-arg 构造函数。如果它找不到一个,那么它将抛出一个错误。

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

Ref : Oracle Java Tutorial