【问题标题】:Constructor of subtype子类型的构造函数
【发布时间】:2013-09-29 16:44:36
【问题描述】:

考虑

class MyClass{
    public MyClass(Integer i){}
}
class MyExtendedClass extends MyClass{
    public MyExtendedClass(SomeType s){ ... }//Compile error if SomeType!=Integer
    public MyExtendedClass(Integer i){
        super(i);
        ...
    }
}

为什么我们不能用不同于 MyClass 构造函数的签名来定义 MyExtendedClass 的构造函数?为什么我们必须首先调用超类的构造函数?

【问题讨论】:

    标签: java inheritance constructor


    【解决方案1】:

    可以定义具有不同签名的构造函数。但是在子类的构造函数中,您必须调用基类的构造函数。基类需要初始化自己(例如它的私有成员),除了调用它的构造函数之一之外没有其他方法可以做到这一点。

    【讨论】:

      【解决方案2】:

      为什么我们不能用不同于 MyClass 构造函数的签名来定义 MyExtendedClass 的构造函数?

      当然可以。您收到的错误是出于不同的原因。

      为什么一定要先调用超类的构造函数?

      因为你的类的对象就是这样初始化的。对象的状态包括它自己的类中的所有字段,以及所有超类的所有非静态字段。

      所以,当你创建一个实例时,应该为所有超类初始化状态,然后最后是它自己的类。这就是为什么构造函数的第一条语句应该是 super() 链接到超类构造函数,或者 this() 链接到它自己的类构造函数。

      您的代码可能失败的原因是,您尝试使用字符串参数调用超类构造函数。但是目前没有这样的构造函数。超类只有一个带有int 参数的构造函数。此外,添加super() 也不起作用。因为你的超类没有 0-arg 构造函数。

      尝试将您的构造函数更改为:

      public MyExtendedClass(SomeType s){ 
          super(0);  
      }
      

      它会起作用的。或者,为您的超类添加一个 0 参数构造函数,并保持子类构造函数不变。在这种情况下它也可以工作。


      建议阅读:

      【讨论】:

      • 一个对象的状态包括它自己的类中的所有字段,加上所有超类的所有非静态字段。它只在Java 中吗?例如,我们在 C++ 中是否对对象的状态有相同的定义?
      • @St.Antario。我不太确定C++
      【解决方案3】:

      您的构造函数可以有不同的签名。但是您必须调用超级构造函数之一。这就是 Java 的工作原理,请参阅 Java 语言规范。

      备选方案1:您可以调用静态方法,如下所示:

      public MyExtendedClass(SomeType s){ super(convertToInt(s)); }
      private Integer convertToInt(SomeType st){ ... }
      

      备选方案 2:使用组合/委托而不是继承。

      class MyExtendedClass [
        private MyClass delegate;
      public MyExtendedClass(SomeType s){
        do what you want
        delegate = new MyClass(...);
      }
      public void doSomething(... params){
        delegate.doSomething(params);
      }
      

      【讨论】:

        猜你喜欢
        • 2019-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-22
        • 2010-12-31
        相关资源
        最近更新 更多