什么时候必须在Java中使用默认构造函数和参数化构造函数?

很多时候我有一个例外,说“缺少默认构造函数的实现”。 很多时候,参数化构造函数的定义单独执行所有操作。 我想知道这种情况发生在哪种情况下。

编译器不会强制存在默认构造函数。 您可以根据需要使用任何类型的构造函数。

对于某些框架 ,类可能需要具有默认构造函数,但编译器不强制执行此操作。

您可能会遇到的问题是,如果您有一个带有自定义构造函数的类,并且您的构造函数体中没有隐式的super()调用。 在这种情况下,编译器将引入对超类默认构造函数的调用。 如果超类没有默认构造函数,那么您的类将无法编译。

 public class MyClass extends ClassWithNoDefaultConstructor public MyClass() { super(); //this call will be added by the compiler if you don't have any super call here // if the super class has no default constructor the above line will not compile // and removing it won't help either because the compiler will add that call } } 

您是在讨论运行时exception还是编译错误尚不完全清楚。

只有当您的代码(或代码调用的某些库代码)尝试使用reflection来创建某个类的实例,并且意外地尝试使用不存在的构造函数时,才会发生运行时exception。 (我怀疑exception消息会使用术语“默认构造函数”……)

发生编译错误是因为您显式或隐式地尝试调用不存在的“no args”构造函数。 有三种情况’

 // case #1 new Foo(); // case #2 public Bar extends Foo { public Bar() { super(); } } // case #3 public Bar extends Foo { public Bar() { // no explicit 'this' or 'super' call. } } 

前两个例子显然是在调用一个no-args构造函数。

最后一个例子调用no-args构造函数,因为如果你没有在构造函数的开头有一个显式super或者this “调用”,那么JLS会说会调用super() ……在所有情况下都会分开来自Object的构造函数。


最后,您回答标题中的问题:

什么时候必须在Java中使用默认构造函数和参数化构造函数?

严格地说,拥有默认构造函数绝不是强制性的。 只有在显式或隐式调用它时,必须有一个无args构造函数(显式声明或默认)。

(可能有库/框架假设您的类具有无参数构造函数,但这超出了我们可以回答的范围。此外,这样的假设将使得实例可以reflection性地创建……而我已经覆盖了那个。)

通常,当通过reflection创建类的实例时(例如,在反序列化时),可能会发生这种情况。 如果您的类是Serializable或其实例可以通过reflection机制创建,则应该定义默认构造函数。

如果类中没有构造函数,则在编译时添加一个默认构造函数。

如果类中存在任何一个参数化构造函数,则在编译时不会添加默认构造函数。

因此,如果您的程序包含任何包含参数的构造函数,并且未指定默认构造函数,那么您将无法使用Default构造函数创建该类的对象。

例如:

 class A{ A(int a){} } A a = new A() -----> Error. ------------------------------------------------------- class A{ A(int a){} A(){} } A a = new A() -----> It will work. ----------------------------------------------------------- class A{ } A a = new A() -----> It will work. 

正如Joachim Sauer所说,当你使用像spring这样的框架时,它的重要/有时需要提供除参数化构造函数之外的默认构造函数。 因为如果你想通过dependency injection在另一个类中注入你的类对象,那么该类应该有默认的构造函数。

否则您的dependency injection将失败。

它只是一个场景,我遇到了默认构造函数的重要性

编译器将在编译代码时添加默认构造函数,但是当您在代码中声明参数化构造函数时,将省略默认构造函数。

当使用参数化构造函数重载默认构造函数时,在使用默认构造函数而不是参数化构造函数创建对象时,必须在代码中具有默认构造函数。