繁体   English   中英

为什么默认构造函数需要在实例化Object时在具有Parameterized Constructor的POJO文件中声明?

[英]Why Default constructor need to declare in POJO file which has Parameterized Constructor while instantiating Object?

假设我有一个POJO类User,其中包含一个constuctor public User(int id, String name){...} 但是当我实例化User对象之类的User u=new User()时没有参数Eclipse会给出错误,如构造函数User()未定义 但是当我没有参数化的构造函数时,它工作正常。 有人可以解释为什么它需要定义默认构造函数?

如果您未提供其他构造函数,则仅提供默认(无参数)构造函数。 如果为类定义了一个构造函数,则必须使用显式定义的(即在代码中)构造函数之一来实例化对象。 当然,您可以定义自己的零参数空构造函数,如果它适用于您要执行的操作。

编辑:回答why?

编译器提供默认构造函数,以便在没有定义构造函数时可以实例化Object。 但是,如果您已经定义了参数化构造函数,则意味着当您创建该类的新实例时,其变量应使用您传递的参数进行初始化(或执行类似的操作)。 如果没有这些初始化,对象可能不会以预期的方式运行。 因此,编译器通过不定义默认构造函数(当您定义了默认构造函数时)来防止发生这种情况。

如果开发人员没有提供构造函数,编译器将自动添加no-arg构造函数。 但是,只要您放置自己的自定义参数化构造函数,编译器就会停止为您添加默认构造函数。

在这种情况下,如果您仍想使用no-arg构造函数,则必须自己提供它:

public User() {
}

public User(int id, String name) {
}

这背后的逻辑是:如果定义自己的参数化构造函数,则声明构造函数中列出的参数是构造类的对象所必需的。 因此,如果库的用户不提供这两个参数,您也可以隐式声明,该对象不应该构造。 因此编译器不会为您添加no-arg构造函数。

如果你想声明你的类仍然可以工作,如果参数化构造函数中没有提供任何指定的参数而你(没有arg),那么你可以通过自己提供非arg构造函数来明确声明它。

我这么晚才回答,但让我们试着和你分享我所知道的:

  1. 当你不提供构造函数编译器提供构造函数时。 为什么? 因为您确定要仅使用参数构造函数初始化对象。 所以编译器会为你做。
  2. 当您提供参数化构造函数时,编译器不知道您将使用哪个构造函数来初始化对象。 所以编译器没有为你提供一个无参构造函数。 所以你必须明确写。

    希望它会对你有所帮助。

Java编译器自动为没有构造函数的任何类提供无参数的默认构造函数。 如果您的类中没有定义构造函数,那么Java编译器将在生成的类文件中添加无参数构造函数。 但是如果你的类中有一个带参数的构造函数,那么你需要编写无参数构造函数,编译器不会添加它。

编译器自动为没有构造函数的任何类提供无参数的默认构造函数,但如果您明确地为任何构造函数提供参数,那么编译器将不会提供默认构造函数,主要是出于安全原因。

所以你能做的就是

 public User(int id, String name){...}
 public User(){this(defualtID,defaultName)};

暂无
暂无

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

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