假设我有一个带有构造函数的 POJO 类 User public User(int id, String name){...}
。但是当我像User u=new User()
没有参数一样实例化 User 对象时,Eclipse 会给出像The constructor User() is undefined这样的错误。但是当我没有参数化构造函数时它工作正常。有人可以解释为什么它需要定义默认构造函数吗?
5 回答
仅当您未提供其他构造函数时才提供默认(无参数)构造函数。如果你为你的类定义了一个构造函数,你必须使用一个显式定义的(即在你的代码中)构造函数来实例化对象。当然,您可以定义自己的零参数空构造函数,如果这适用于您正在尝试做的事情。
编辑:答案why?
编译器提供了一个默认构造函数,以便在没有定义构造函数时可以实例化对象。但是,如果您定义了参数构造函数,这意味着当您创建该类的新实例时,它的变量应该使用您传递的参数进行初始化(或执行类似的操作)。如果没有这些初始化,对象可能不会以预期的方式运行。因此,编译器通过不定义默认构造函数(当您定义了一个构造函数时)来防止此类事情发生。
如果开发人员没有提供构造函数,编译器将自动添加无参数构造函数。但是,一旦您放置了自己的自定义参数化构造函数,编译器就会停止为您添加默认构造函数。
在这种情况下,如果您仍想使用无参数构造函数,则必须自己显式提供:
public User() {
}
public User(int id, String name) {
}
这背后的逻辑是:如果你定义了自己的参数化构造函数,你就是在声明构造函数中列出的参数是构造类的对象所必需的。因此,如果您的库的用户不提供这两个参数,您也可以隐式声明,该对象不应该能够构造。因此编译器不会为您添加无参数构造函数。
如果您还想声明如果没有提供参数化构造函数中的指定参数并且您(没有 arg),您的类仍然可以工作,那么您可以通过自己提供非 arg 构造函数来明确声明。
我这么晚才给出答案,但让我们尝试与您分享我所知道的:
当您不提供构造函数时,编译器会提供构造函数。为什么 ?因为它确定你将只用没有参数的构造函数来初始化你的对象。所以编译器会为你做这件事。
当您提供参数化构造函数时,编译器不知道您将使用哪个构造函数来初始化对象。所以编译器没有为你提供一个无参数的构造函数。所以你必须明确地写。
希望它会帮助你。
Java 编译器会自动为任何没有构造函数的类提供无参数的默认构造函数。如果您的类中没有定义构造函数,那么 Java 编译器将在您生成的类文件中添加一个无参数构造函数。但是如果你的类中有带参数的构造函数,那么你需要编写无参数的构造函数,编译器不会添加它。
编译器会自动为没有构造函数的任何类提供无参数的默认构造函数,但如果您显式提供任何带参数的构造函数,则编译器将不会提供默认构造函数,主要是出于安全原因。
所以你能做的是
public User(int id, String name){...}
public User(){this(defualtID,defaultName)};