Java构造器继承

Java构造器继承

我想知道为什么在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);
  }}

这个代码是重复的,不是干的和无用的(IMHO).因此,这再次提出了一个问题:

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



素胚勾勒不出你
浏览 258回答 3
3回答

斯蒂芬大帝

假设构造函数都是遗传的.。因为每个类最终都是从对象派生出来的,每一,每个类将以无参数构造函数结束。馊主意。你到底期望什么:FileInputStream stream = new FileInputStream();去做?现在可能有一种方法可以轻松地创建“通过”构造函数,这是相当常见的,但我不认为它应该是默认的。构造子类所需的参数通常与超类所需的参数不同。

拉丁的传说

当你从超级继承时,这就是现实中发生的事情: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不支持构造函数继承,可能是因为构造函数只有在讨论具体实例时才有意义,而且当您不知道如何(通过多态)定义某物的实例时,您不应该能够创建它的实例。

大话西游666

因为构建子类对象的方式可能与构建超类的方式不同。您可能不希望子类的客户端能够调用超类中可用的某些构造函数。一个愚蠢的例子:class Super {     protected final Number value;     public Super(Number value){         this.value = value;     }}class Sub {     public Sub(){ super(Integer.valueOf(0)); }     void doSomeStuff(){         // We know this.value is an Integer, so it's safe to cast.         doSomethingWithAnInteger((Integer)this.value);     }}// Client code:Sub s = new Sub(Long.valueOf(666L)):      // Devilish invocation of Super constructor!s.doSomeStuff();      // throws ClassCastException或者更简单:class Super {     private final String msg;     Super(String msg){         if (msg == null) throw new NullPointerException();         this.msg = msg;     }}class Sub {     private final String detail;     Sub(String msg, String detail){         super(msg);         if (detail == null) throw new NullPointerException();         this.detail = detail;     }     void print(){         // detail is never null, so this method won't fail         System.out.println(detail.concat(": ").concat(msg));     }}// Client code:Sub s = new Sub("message");      // Calling Super constructor - detail is never initialized!s.print();       // throws NullPointerException从本例中可以看出,您需要某种方式声明“我想继承这些构造函数”或“我想继承除这些构造函数之外的所有构造函数”,然后还必须指定默认构造函数继承首选项,以防有人在超类中添加新构造函数.或者,如果您想要“继承”它们,那么只需要从超类中重复构造函数,这可以说是更明显的方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java