在Java中_not_调用超类构造函数的任何方法?

Миш*_*лев 24 java oop constructor super

如果我有课:

class A {
   public A() { }
}
Run Code Online (Sandbox Code Playgroud)

和另一个

class B extends A {
   public B() { }
}
Run Code Online (Sandbox Code Playgroud)

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

pol*_*nts 28

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

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

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

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


Ada*_*ski 20

您可以实现的最接近期望的行为是将通常在构造函数中执行的初始化委托给模板方法,然后在子类实现中覆盖该模板方法.例如:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • "有效的Java第2版,第17项:继承的设计和文档,或者禁止它:构造函数不能直接或间接地调用可覆盖的方法." (7认同)
  • 我不是说这是件好事 - 我只是说你是怎么做的. (3认同)
  • +1提供唯一有用的答案;) (2认同)

Dol*_*lph 8

如果您不想调用超类构造函数,则对象模型还有其他问题.

  • 在类只作为类型标识符而不提供功能的情况下,例如空对象模式,试图避免在层次结构中调用构造函数的开销有什么问题?! (3认同)

Bli*_*ndy 0

不,如果可以的话,您的派生对象就不会真正是它现在派生的对象,不是吗?is-a 原则将被违反。因此,如果您确实需要它,那么多态性就不是您所追求的。