覆盖Java中的默认构造函数

时间:2012-08-07 16:09:21

标签: java constructor initialization

非常简单的问题,但无论如何:有没有理由像这样覆盖默认构造函数:

public SomeObject(){
}

是公开的。它没有任何逻辑。那么,有必要吗?我没看到全貌?

感谢您的所有帮助。

4 个答案:

答案 0 :(得分:10)

定义 no-arg构造函数的一个原因是,如果是非默认构造函数,并且仍希望可以访问no-arg构造函数(公共或受保护的。)

这是因为默认的无参数构造函数的任何[其他]构造函数定义will prevent the automatic addition

  

编译器自动为没有构造函数的任何类提供[public]无参数,默认构造函数。

(请参阅该链接中的下一位,它将讨论将要调用的默认超级构造函数。)

即使从不手动使用no-arg构造函数,它对其他事情也很重要,例如Serializable

  

在反序列化期间,将使用类的public或protected no-arg构造函数初始化非可序列化类的字段。 一个no-arg构造函数必须可以被可序列化的子类访问。可序列化子类的字段将从流中恢复。

答案 1 :(得分:4)

唯一的原因可能是,有时您可能有带参数的构造函数,并且您希望在不传递参数的情况下允许创建对象(通过调用默认构造函数)。

当你定义了构造函数时,没有arg构造函数不可用,所以你必须明确地将它添加到你的类中。

答案 2 :(得分:1)

除非你有任何初始化逻辑,否则不需要覆盖默认构造函数。

答案 3 :(得分:1)

确切的原因是,如果不这样做,在扩展课程时会遇到问题

class A{
    int a;
    public A(int a){
        this.a=a;
    }
    // public A()
    //{
        // here super(); will be called again, calling Object class's constructor thus initializing any uninitialized variables
    //}
}

class B extends A{
    int b;
    public B(int b){
        // here automatically, "super();" will be executed. if it is not present, error!
        this.b=b;
    }
}

通过thisthis了解我想说的内容。

编辑:有些答案实际上是错误的,因为正如您所看到的,在扩展类时必须定义父无参数构造函数,除非您使用args显式调用重载的超级构造函数。