有什么方法可以在Java中调用超类构造函数?

2022-09-01 09:28:51

如果我有一个类:

class A {
   public A() { }
}

和另一个

class B extends A {
   public B() { }
}

有没有办法打电话?B.B()A.A()


答案 1

在Java中绝对没有办法做到这一点;它会破坏语言规范。

JLS 12 执行 / 12.5 创建新类实例

在将对新创建对象的引用作为结果返回之前,将使用以下过程处理指示的构造函数以初始化新对象:

  1. 为构造函数分配参数 [...]
  2. 如果此构造函数以显式构造函数调用同一类中的另一个构造函数(使用)开始,则 [...]this
  3. 此构造函数不以显式构造函数调用同一类中的另一个构造函数(使用 )开始。如果此构造函数用于 以外的类则此构造函数将以超类构造函数的显式或隐式调用开始(使用 )。thisObjectsuper
  4. 执行此类的实例初始值设定项和实例变量初始值设定项 [...]
  5. 执行此构造函数的主体的其余部分 [...]

答案 2

最接近所需行为的是将通常在构造函数中执行的初始化委托给模板方法,然后在子类实现中重写该模板方法。例如:

public class A {
  protected Writer writer;

  public A() {
    init();
  }

  protected void init() {
    writer = new FileWriter(new File("foo.txt"));
  }
}

public class B extends A {
  protected void init() {
    writer = new PaperbackWriter();
  }
}

但是,正如其他人所指出的那样,这通常可能表明您的设计存在问题,在这种情况下,我通常更喜欢合成方法;例如,在上面的代码中,您可以定义构造函数以接受实现作为参数。Writer