我想知道为什么在java构造函数是不继承的?你知道当你上这样的课时:

public class Super {

  public Super(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){
    this.serviceA = serviceA;
    //etc
  } 

}

以后当你从Super继承时,java会抱怨没有定义默认构造函数。解决方案显然是这样的:

public class Son extends Super{

  public Son(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){
    super(serviceA,serviceB,serviceC);
  }

}

这段代码是重复的,不是DRY和无用的(恕我直言)…这又带来了一个问题:

为什么java不支持构造函数继承?不允许这种继承有什么好处吗?


当前回答

构造函数不是多态的。 当处理已经构造的类时,可以处理对象的声明类型或其任何子类。这就是继承的用处。 构造函数总是在特定类型上被调用,例如new String()。假设的子类在这方面没有作用。

其他回答

派生类与其基类不是同一个类,您可以也可以不关心基类的任何成员是否在构造派生类时进行了初始化。这是由程序员而不是编译器决定的。

大卫的答案是正确的。我想补充的是,您可能会从上帝那里得到一个信号,表明您的设计是一团糟的,“Son”不应该是“Super”的子类,相反,Super有一些实现细节,最好通过拥有Son提供的功能来表达,作为一种策略。

编辑:乔恩·斯基特的回答太棒了。

构造函数不是多态的。 当处理已经构造的类时,可以处理对象的声明类型或其任何子类。这就是继承的用处。 构造函数总是在特定类型上被调用,例如new String()。假设的子类在这方面没有作用。

从某种意义上说,你确实继承了构造函数,你可以简单地调用super,如果合适的话,只是它很容易出错,因为其他人已经提到过,如果它默认发生的话。编译器不能假定什么时候合适,什么时候不合适。

编译器的工作是提供尽可能多的灵活性,同时降低复杂性和意外副作用的风险。

因为(超)类必须完全控制自己的构造方式。如果程序员认为在类的契约中提供默认(不带参数)构造函数没有意义,那么编译器就不应该提供这样的构造函数。