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


当前回答

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

其他回答

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

FileInputStream stream = new FileInputStream();

做什么?

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

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

当你从Super继承时,这是现实发生的情况:

public class Son extends Super{

  // If you dont declare a constructor of any type, adefault one will appear.
  public Son(){
    // If you dont call any other constructor in the first line a call to super() will be placed instead.
    super();
  }

}

这就是原因,因为你必须调用你唯一的构造函数,因为"Super"没有默认的构造函数。

现在,尝试猜测为什么Java不支持构造函数继承,可能是因为构造函数只有在谈论具体实例时才有意义,并且当您不知道如何(通过多态性)定义某个对象时,您不应该能够创建该对象的实例。

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

我不知道任何一种语言的子类继承构造函数(但是,我不是一个编程多面手)。

这里有一个关于c#的相同问题的讨论。普遍的共识似乎是,它会使语言复杂化,为基类中的更改引入潜在的严重副作用,并且通常在良好的设计中不应该是必要的。