假设我有一个POJO类用户,其构造函数为public User(int id, String name){...}
。 但是当我实例化用户对象像User u=new User()
没有参数Eclipse给出了错误,如构造函数User()未定义。但是当我没有参数化的构造函数时它工作正常。有人可以解释为什么它需要定义默认的构造函数吗?为什么默认的构造函数需要在实例化Object时使用Parameterized构造函数在POJO文件中声明?
回答
如果您没有提供其他参数,则仅提供默认(无参数)构造函数。如果你为你的类定义了一个构造函数,你必须使用一个明确定义的(即在你的代码中)构造函数来实例化这个对象。当然,您可以定义您自己的零参数空构造函数,如果这适用于您正在尝试执行的操作。
编辑:的why?
编译器提供一个默认的构造函数,以便对象可以在没有定义的构造函数实例化 答案。但是如果你已经定义了一个参数构造函数,这意味着当你创建该类的一个新实例时,它的变量应该用你传递的参数进行初始化(或者做类似的事情)。没有这些初始化,对象可能不会以预期的方式运行。因此,编译器通过不定义默认构造函数(当您定义了一个构造函数时)来防止发生这种情况。
Java编译器自动为任何没有构造函数的类提供一个无参数的默认构造函数。如果在你的类中没有定义构造函数,那么Java编译器会在你生成的类文件中添加一个无参数构造函数。但是如果在你的类中有一个带参数的构造函数,那么你需要编写无参数构造函数,编译器不会添加它。
您一直在讨论添加构造函数的JVM - 事实并非如此。编译器的确如此。 (而且它是一个没有参数*的构造函数,而不是*参数* - 在调用构造函数或方法时提供了参数。) –
@JonSkeet是的,我正在修正它,而你提交:-)谢谢! –
但不是参数部分? (我不确定这个答案实际上是否真的增加了Kon的任何东西,老实说。) –
编译器会自动为任一类无参数,默认构造函数没有构造,但如果你明确地提供任何构造函数的参数则编译器不会提供一个默认的构造主要是由于安全原因。如果没有构造是由开发商提供
所以你可以做的是
public User(int id, String name){...}
public User(){this(defualtID,defaultName)};
的无参数的构造函数会被编译器自动添加。但是,只要您放入自定义参数化构造函数,编译器就会停止为您添加默认构造函数。
在这种情况下,如果你仍然想使用无参数的构造函数,你必须自己明确地提供它:
public User() {
}
public User(int id, String name) {
}
这背后的逻辑是:如果你定义自己的参数化的构造,您声明构造函数中列出的参数是构造该类的对象所必需的。因此,如果库的用户不提供这两个参数,则该对象也应该无法构造。因此编译器不会为你添加无参数的构造函数。
如果你还想声明你的类仍然可以工作,如果参数化构造函数中没有提供任何指定的参数,并且你(没有参数),那么你有显式声明通过自己提供非参数构造函数。
我给的答案这么晚了,让我们尝试与大家分享我知道:
- 当你不提供构造函数编译器提供的构造函数。为什么?因为它确定你将不使用参数构造函数来初始化对象。所以编译器为你做。
当您提供参数化构造函数时,编译器不知道您将使用哪个构造函数来初始化您的对象。所以编译器不会为你提供一个无参数的构造函数。所以你必须明确地写。
希望它能帮助你。
感谢您分享您所拥有的内容。 :) –
- 1. 在需要复制构造函数时实例化GCC:模板构造函数
- 2. 为什么使用unordered_map和tuple需要默认构造函数?
- 3. 从参数化构造函数调用默认构造函数
- 4. 子类构造函数 - 为什么必须为子类构造函数存在默认构造函数?
- 5. 为什么要在类的构造函数中声明变量?
- 6. 为什么hibernate需要java.lang.Double的默认构造函数?
- 7. 在Object的构造函数中声明Object的数组?
- 8. 我们什么时候需要一个默认构造函数?
- 9. 为什么我们需要在实体中声明NOT空构造函数?
- 10. 为什么范围-V3产量需要默认构造函数
- 11. 为什么ServletContextAttributeListener需要默认构造函数?
- 12. 为什么BroadcastReceiver需要一个默认构造函数?
- 13. 实体框架:为什么实体类的集合类型需要在默认构造函数中实例化?
- 14. 为什么JAVA需要构造函数?
- 15. 使用构造函数声明(构造函数?)
- 16. 默认的默认构造函数,为什么不是用户提供的默认构造函数?
- 17. 为什么默认构造函数在父类中是必需的,如果它具有参数构造函数?
- 18. Java默认构造函数问题 - 实际上构成“默认构造函数”的是什么?
- 19. 统一使用默认构造函数和参数化构造函数c#
- 20. 为什么移动构造函数需要其成员的默认构造函数?
- 21. 默认和参数化构造函数
- 22. 为什么我无法从私有类中的参数化构造函数调用默认构造函数?
- 23. C#构造函数声明
- 24. 从另一个构造函数调用默认构造函数
- 25. C++构造函数调用默认构造函数
- 26. 类默认构造函数
- 27. 默认构造函数
- 28. 非默认构造函数
- 29. C++,默认构造函数
- 30. constexpr默认构造函数
是的我知道这个事实。但为什么呢?为什么JVM不会每次都提供默认构造函数? –
我对“为什么”没有很好的答案。因为这就是语言的建立方式。这可能会避免混淆调用无法明确定义的构造函数。为您提供默认构造函数的Java是100%的礼节。 – Kon
@VimalBera:这不是提供默认构造函数的JVM--它是Java编译器。 –