Java:默认构造函数与非参数构造函数

时间:2016-01-31 18:43:48

标签: java constructor

我想知道两种情况之间的差异是什么。有人可以解释一下吗?

Class MyClass1(){
    String property;
    // has a compiler defined default constructor
    // MyClass1(){ }
}

Vs的

Class MyClass2(){
     String property;
     // has a compiler user defined constructor
     MyClass2(){ }
}

2 个答案:

答案 0 :(得分:1)

当且仅当没有写入显式构造函数时,才会出现第一种情况(编译器定义的默认构造函数)。如果类本身是公共的,则它是公共的,并且需要publicprotected的无参数超类构造函数(编译器默认或显式)。 JLS

第二个选项,带有用户定义的构造函数,允许您实际将初始化代码放入其中。即使没有参数,您的构造函数仍可能想要执行某些操作(例如,将构造对象的时间戳存储到字段中)。

此外,如果您正在为此类编写子类,并且未显式调用超类构造函数,则将调用no-arg super()构造函数。如果它不存在,则会抛出错误,因此您可以声明protected MyClass2(){}以允许子类进行该调用。

答案 1 :(得分:1)

第二个示例只能由同一个包中的类实例化(因为您在构造函数上有默认 - 或包级别 - 可见性)。编译器不会添加默认构造函数,因为您有一个显式构造函数。为了使它们等效,它需要具有public级别的可见性,如

class MyClass3() {
     String property;
     public MyClass3() {
         super(); // <-- implicit before.
         this.property = null; // <-- also implicit before. 
     }
}