非常简单的问题,但无论如何:有没有理由像这样覆盖默认构造函数:
public SomeObject(){
}
是公开的。它没有任何逻辑。那么,有必要吗?我没看到全貌?
感谢您的所有帮助。
答案 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;
}
}
编辑:有些答案实际上是错误的,因为正如您所看到的,在扩展类时必须定义父无参数构造函数,除非您使用args显式调用重载的超级构造函数。