我想知道两种情况之间的差异是什么。有人可以解释一下吗?
Class MyClass1(){
String property;
// has a compiler defined default constructor
// MyClass1(){ }
}
Vs的
Class MyClass2(){
String property;
// has a compiler user defined constructor
MyClass2(){ }
}
答案 0 :(得分:1)
当且仅当没有写入显式构造函数时,才会出现第一种情况(编译器定义的默认构造函数)。如果类本身是公共的,则它是公共的,并且需要public
或protected
的无参数超类构造函数(编译器默认或显式)。 JLS
第二个选项,带有用户定义的构造函数,允许您实际将初始化代码放入其中。即使没有参数,您的构造函数仍可能想要执行某些操作(例如,将构造对象的时间戳存储到字段中)。
此外,如果您正在为此类编写子类,并且未显式调用超类构造函数,则将调用no-arg super()
构造函数。如果它不存在,则会抛出错误,因此您可以声明protected MyClass2(){}
以允许子类进行该调用。
答案 1 :(得分:1)
第二个示例只能由同一个包中的类实例化(因为您在构造函数上有默认 - 或包级别 - 可见性)。编译器不会添加默认构造函数,因为您有一个显式构造函数。为了使它们等效,它需要具有public
级别的可见性,如
class MyClass3() {
String property;
public MyClass3() {
super(); // <-- implicit before.
this.property = null; // <-- also implicit before.
}
}