2012-08-07 129 views
3

很简单的问题,但无论如何:没有任何理由来覆盖默认的构造函数是这样的:重写默认的构造函数

public SomeObject(){ 
} 

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

感谢您的帮助。

+0

并非如此,但如果您在实例化对象时需要添加一些代码,它将允许在将来保存几秒钟。然而'私人SomeObject(){}'确实让多一点感觉:) - 也是在C++中是很常见的礼遇':: SomeObject(){}'和'::〜SomeObject(){}'即使包括他们没有使用。 – 2012-08-07 16:13:13

回答

9

一个原因来定义无参数的构造函数,如果有一个非默认的构造函数和无参数的构造函数仍然希望被访问(公共或保护)。

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

编译器自动提供了[公共]无参数,对于没有任何构造类默认的构造。

(请参阅该链接下位为好,它谈到了默认的超级构造函数将被调用。)

即使无参数的构造函数是永远不会用手动,也可以是对其他事物很重要,例如Serializable

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

+1

这是正确的答案。另一方面,如果你在Android中开发,并且你没有在具有非默认构造函数的Fragment中提供无参数构造函数,那么当你从睡眠中唤醒你的应用程序时会发生崩溃,因为系统使用no-arg构造函数来实例化你的Fragment。 – 2012-08-07 21:58:35

+0

谢谢。简单而全面的答案。 – 2012-08-08 07:27:39

1

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

4

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

如果您定义了构造函数,则不会有arg构造函数可用,因此您必须将它明确地添加到您的类中。

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无参数的构造函数是强制性的。

+0

它不需要**如果**隐式调用重载构造函数。所以,你不能说它不是_not_,就像它根本不是! O_O – Prasanth 2012-08-07 17:24:45