如果重载构造函数,如何调用super(...)和this(...)?

时间:2011-08-06 08:02:14

标签: 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 dataCovered, Price price)
{
    super(user);

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

    this.dataCovered = dataCovered;


}
   ...
}

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

4 个答案:

答案 0 :(得分:13)

你不能同时调用super(..)和this(...)。你可以做的是重新设计你的overloadeded构造函数的结构,这样最后一个被调用的将调用super(...)。 如果这不是一个选项,您将必须在每个构造函数中进行分配。

答案 1 :(得分:6)

如果你调用this(user,dataCovered,null),将调用第二个构造函数,它将要做的第一件事就是调用超级构造函数。所以第一个构造函数中的行super(user);是不必要的。

答案 2 :(得分:0)

在构造函数中有(除了其他类似调用不是来自或超出或者内部的实例方法)这三个限制:

  • 每个构造函数只能调用super(...)this(...)
  • superthis始终必须是方法
  • 中的第一个语句
  • 如果您未提供任何这些,则在构造函数的开头有一个隐式super()

原因是对象只能创建一次。并且super通过调用重载的构造函数来创建一个对象,而这是委托给同一个类的另一个构造函数。

正如另一个答案所说的那样,在您的情况下,您不需要第一个super,因为您的this语句正在委托给已经调用super(user)的其他构造函数。

答案 3 :(得分:0)

我将在类中的静态方法中将构造函数中需要执行的逻辑分离出来,并将其称为两个构造函数,以避免重复。但是,在您的情况下,您可以跳过第一个构造函数的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;
}
}