Java 在重载构造函数的情况下,如何调用super(…)和this(…)?

Java 在重载构造函数的情况下,如何调用super(…)和this(…)?,java,constructor,superclass,Java,Constructor,Superclass,我以前从未需要这样做,但既然两者都必须是构造函数中的“第一”行,那么应该如何处理呢?对于这种情况,什么是最好的重构 以下是一个示例: public class Agreement extends Postable { public Agreement(User user, Data dataCovered) { super(user); this(user,dataCovered,null); } public Agreement(User user,Data dataC

我以前从未需要这样做,但既然两者都必须是构造函数中的“第一”行,那么应该如何处理呢?对于这种情况,什么是最好的重构

以下是一个示例:

public class Agreement extends Postable {


public Agreement(User user, Data dataCovered)
{
    super(user);
    this(user,dataCovered,null);

}

public Agreement(User user,Data dataCovered, Price price)
{
    super(user);

    if(price!=null)
        this.price = price;

    this.dataCovered = dataCovered;


}
   ...
}
调用
super(用户)
是绝对必须的。在这种情况下如何处理“可选参数”?我能想到的唯一方法就是重复,也就是说,根本不要把这个叫做(…)。只需在每个构造函数中执行赋值

如果调用
this(user,dataCovered,null)
,将调用第二个构造函数,它要做的第一件事是调用超级构造函数。因此,行
super(用户)是不必要的。

不能同时调用super(…)和this(…)。您可以做的是重新处理重载构造函数的结构,以便最后一个要调用的构造函数将调用super(…)。 如果这不是一个选项,那么您必须在每个构造函数中进行赋值

在构造函数中有以下三个限制(其中包括从super或this调用not instance方法或在super或this中调用not instance方法):

  • 每个构造函数只能调用一个
    super(…)
    this(…)
  • super
    必须始终是方法中的第一条语句
  • 如果您没有提供其中任何一个,则在构造函数的开头有一个隐式的
    super()
原因是一个对象只能创建一次。
super
通过调用重载构造函数创建对象,同时将其委托给同一类的另一个构造函数


另一个答案是,在您的情况下,您不需要第一个
super
,因为您的
语句将委托给另一个已在调用
super(user)
的构造函数,我将在类中的静态方法中分离出您需要在构造函数中执行的逻辑,只需将其称为froum和constructor,以避免重复。但是,在您的情况下,您可以跳过第一个构造函数对
super(user)
的调用,第二个构造函数将为您调用它:)。我将反转构造函数之间的“依赖关系”,如下所示:

public class Agreement extends Postable {


public Agreement(User user, Data dataCovered)
{
    super(user);
    setDataCovered(dataCovered);

}

public Agreement(User user, Data dataCovered, Price price)
{
    this(user, dataCovered);

    if(price!=null)
        setPrice(price);

}

private static void setDataCovered(Data dataCovered) {
     this.dataCovered = dataCovered;
}

private staitc void setPrice(Price price) {
     this.price = price;
}
}

不需要
super(user)
在第一个方法中,您可以通过调用
this(user,dataCovered,null)
来调用它。如果第二个方法中包含了第一个构造函数,那么最简单的方法肯定是根本不提供第一个构造函数。只要证明
Price
可以传递空值就行了。我知道它必须是这么简单的东西!!当然!我想我是在用已经准备好的supers()进行重构,因此产生了混乱!!!我喜欢使用私有的void初始化方法,对构造函数进行普通初始化。你和S.L在答案上只相差4秒!!我仍然会将S.L.作为答案,这将有助于提高他/她的评分…希望你不介意:)@Nupul mark作为解决方案的更好答案;目前的评级不应该超过答案的质量。我同意这一点@努普,礼貌的想法是非常感激的。但请把你认为最好的答案标出来。@dlev:同意。从我的观点来看,根据质量/信息,两个答案完全相同。S.L还提到了如果他的选择不可行,该怎么办。我永远不会为提高某人的评级而给出答案!!!只是我必须在两个答案之间做出选择,两个答案相隔4秒,只要思考就会让Mark(和其他人)知道我的选择。@s.L.请注意,我不是在评论本例中答案的相对质量:)。我只是说,一般来说,最高质量的答案(实际上解决了您的问题)应该标记为解决方案。所以您会将价格和数据覆盖更改为静态字段吗?@Erik:有趣的一点。但是,在“链”中最后一个“被调用”构造函数上调用super似乎更简单!