繁体   English   中英

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

[英]Do I really need to define default constructor in java?

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

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

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

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

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

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

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

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

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

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提供的这个默认构造函数调用了超类的无参数构造函数。 如果找不到,那么就会抛出错误。

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

参考: Oracle Java教程

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

这正是预期的行为。

Java会自动为没有任何构造函数的类生成缺省值(无参数构造函数)。

如果定义另一个构造函数(带参数),则不会生成默认构造函数。 如果你还想要一个,你需要自己定义它。

每当你的类被编译时,如果编译器在类中没有找到任何有效的构造函数(默认,参数化),那么它将替换自己生成的类的默认构造函数。

你必须注意到,你可以创建没有在你的类中定义任何默认构造函数的对象,有自动生成的默认构造函数的概念。每当创建对象时,都会调用默认构造函数。

但是,如果在类中定义参数化构造函数,则意味着您将对象限制为具有该参数

示例:每位员工都必须拥有ID。

所以,那时,编译器不会在那里插入任何默认构造函数,因为类中有有效的构造函数。如果你也需要默认构造函数,你必须自己定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM