我真的需要在java中定义默认构造函数吗?
2022-09-01 02:50:38
当构造函数未定义时,它可以正常工作,但是如果我定义了参数化构造函数而不是默认构造函数,并且在创建对象时未传递任何值,则会给出错误。我认为构造函数是预定义的。
如果我定义了参数化构造函数,为什么需要定义默认构造函数?不是预定义的默认构造函数吗?
当构造函数未定义时,它可以正常工作,但是如果我定义了参数化构造函数而不是默认构造函数,并且在创建对象时未传递任何值,则会给出错误。我认为构造函数是预定义的。
如果我定义了参数化构造函数,为什么需要定义默认构造函数?不是预定义的默认构造函数吗?
仅当您自己不定义任何构造函数时,才会自动创建默认(无参数)构造函数。
如果需要两个构造函数,一个带参数,一个不带参数,则需要手动定义这两个构造函数。
虽然上面的所有答案都是正确的,但对于新来者来说,把它包裹在脑子里有点困难。我将尝试为新来者重新回答这个问题。
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