2013-08-21 22 views

回答

4

如果您没有提供其他参数,则仅提供默认(无参数)构造函数。如果你为你的类定义了一个构造函数,你必须使用一个明确定义的(即在你的代码中)构造函数来实例化这个对象。当然,您可以定义您自己的零参数空构造函数,如果这适用于您正在尝试执行的操作。

编辑:的why?

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

+0

是的我知道这个事实。但为什么呢?为什么JVM不会每次都提供默认构造函数? –

+0

我对“为什么”没有很好的答案。因为这就是语言的建立方式。这可能会避免混淆调用无法明确定义的构造函数。为您提供默认构造函数的Java是100%的礼节。 – Kon

+7

@VimalBera:这不是提供默认构造函数的JVM--它是Java编译器。 –

0

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

+6

您一直在讨论添加构造函数的JVM - 事实并非如此。编译器的确如此。 (而且它是一个没有参数*的构造函数,而不是*参数* - 在调用构造函数或方法时提供了参数。) –

+0

@JonSkeet是的,我正在修正它,而你提交:-)谢谢! –

+1

但不是参数部分? (我不确定这个答案实际上是否真的增加了Kon的任何东西,老实说。) –

0

编译器会自动为任一类无参数,默认构造函数没有构造,但如果你明确地提供任何构造函数的参数则编译器不会提供一个默认的构造主要是由于安全原因。如果没有构造是由开发商提供

所以你可以做的是

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

的无参数的构造函数会被编译器自动添加。但是,只要您放入自定义参数化构造函数,编译器就会停止为您添加默认构造函数。

在这种情况下,如果你仍然想使用无参数的构造函数,你必须自己明确地提供它:

public User() { 
} 

public User(int id, String name) { 
} 

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

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

1

我给的答案这么晚了,让我们尝试与大家分享我知道:

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

    希望它能帮助你。

+0

感谢您分享您所拥有的内容。 :) –

相关问题