3

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

public SomeObject(){
}

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

感谢您的所有帮助。

4

4 回答 4

10

定义一个空的无参数构造函数的一个原因是如果还有一个非默认构造函数并且仍然希望无参数构造函数是可访问的(公共的或受保护的)。

这是因为任何 [other] 构造函数定义都会阻止自动添加默认的无参数构造函数:

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

(也请参阅该链接中的下一点,其中讨论了将被调用的默认超级构造函数。)

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

在反序列化期间,不可序列化类的字段将使用类的公共或受保护的无参数构造函数进行初始化。可序列化的子类必须可以访问无参数构造函数。可序列化子类的字段将从流中恢复。

于 2012-08-07T16:12:13.557 回答
4

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

当您定义了构造函数时,没有 arg 构造函数将不可用,因此您必须将其显式添加到您的类中。

于 2012-08-07T16:13:24.097 回答
1

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

于 2012-08-07T16:12:05.737 回答
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;
    }
}

通过这个这个来理解我想说的。

编辑:一些答案实际上是错误的,因为如您所见,在扩展类时定义父无参数构造函数是强制性的,除非您将使用 args 显式调用重载的超级构造函数。

于 2012-08-07T16:29:18.130 回答