在Java中重写默认构造函数

在Java中重写默认构造函数,java,constructor,initialization,Java,Constructor,Initialization,这个问题很简单,但不管怎样:有什么理由像这样覆盖默认构造函数: public SomeObject(){ } 这是公开的。它没有任何逻辑。那么,有必要吗?我没有看到整个画面 感谢您的帮助。除非您有任何初始化逻辑,否则无需重写默认构造函数。定义空无参数构造函数的一个原因是,如果还有一个非默认构造函数,并且仍然希望无参数构造函数可访问(公共或受保护) 这是因为默认无参数构造函数的任何[其他]构造函数定义: 编译器会自动为任何没有构造函数的类提供一个[public]无参数的默认构造函数 (请参阅该链

这个问题很简单,但不管怎样:有什么理由像这样覆盖默认构造函数:

public SomeObject(){
}
这是公开的。它没有任何逻辑。那么,有必要吗?我没有看到整个画面


感谢您的帮助。

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

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

这是因为默认无参数构造函数的任何[其他]构造函数定义:

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

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

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

在反序列化过程中,不可序列化类的字段将使用该类的public或protected no arg构造函数进行初始化。无参数构造函数必须可被可序列化的子类访问。可序列化子类的字段将从流中恢复


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


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

确切的原因是,如果您不这样做,则在扩展类时会出现问题

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;
    }
}
仔细阅读并理解我想说的话


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

不太正确,但是,如果在实例化对象时需要添加一些代码,它允许在将来节省几秒钟的时间<代码>私有对象(){} /Cuth.>但是确实有点意义:)——在C++中,常见的礼貌包括:<代码>::某个对象({} < /Cord>和<代码>::~(a)对象>({} < /代码>),即使它们未被使用。如果隐式调用重载构造函数,则不需要。所以,你不能说它不是,就像它根本不是一样!这是正确的答案。另一方面,如果您在Android中开发,并且您没有在具有非默认构造函数的片段中提供无参数构造函数,那么当您从睡眠中唤醒应用程序时,您会遇到崩溃,因为系统使用无参数构造函数来实例化您的片段。谢谢。简单而全面的回答。