Java 构造函数继承

2022-08-31 06:17:55

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

public class Super {

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

}

稍后从 继承时,java 会抱怨没有定义缺省构造函数。解决方案显然是这样的:Super

public class Son extends Super{

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

}

这个代码是重复的,不是干的和无用的(恕我直言)...所以这又带来了一个问题:

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


答案 1

假设构造函数继承...然后,由于每个类最终都从 Object 派生,因此每个类最终都会得到一个无参数构造函数。这是个坏主意。您究竟会期待什么:

FileInputStream stream = new FileInputStream();

要做什么?

现在,应该有一种方法可以轻松创建相当常见的“直通”构造函数,但我认为它不应该是默认值。构造子类所需的参数通常与超类所需的参数不同。


答案 2

当你从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不支持构造函数继承,可能是因为构造函数只有在谈论具体实例时才有意义,并且当你不知道它是如何定义的(通过多态性)时,你不应该能够创建一个实例。


推荐