我想知道为什么在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不支持构造函数继承?不允许这种继承有什么好处吗?


当前回答

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

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

其他回答

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

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

因为构造函数是一个实现细节——它们不是接口/超类的用户实际上可以调用的东西。当他们得到一个实例时,它已经被构造好了;反之亦然,在你构造一个对象的时候根据定义没有变量被赋值给它。

想想强制所有子类都有一个继承的构造函数意味着什么。我认为,直接传入变量比类“神奇地”拥有一个带有一定数量参数的构造函数更清楚,因为它的父类有。

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

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

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

假设构造函数被继承…那么因为每个类最终都是从Object派生的,所以每个类最终都会使用一个无参数的构造函数。这是个坏主意。你的期望是什么?

FileInputStream stream = new FileInputStream();

做什么?

现在应该有一种潜在的方法来轻松地创建“传递”构造函数,这是相当常见的,但我不认为它应该是默认的。构造子类所需的参数通常不同于父类所需的参数。