【问题标题】:Implicit super class constructor MyNumber() is undefined. Must invoke another constructor隐式超类构造函数 MyNumber() 未定义。必须调用另一个构造函数
【发布时间】:2013-10-28 19:07:13
【问题描述】:

我收到以下代码中标题中提到的错误。请告诉我为什么会出现这个错误,尽管我没有在任何地方从超类调用默认构造函数 MyNumber(),以及如何修复它。

package referencereturntype;

公共类 MyNumber { 字符串编号;

public MyNumber(String str){
    num=str;
}

public static void main (String [] args){
    MyNumber my_num= new MyNumber("+2");
    System.out.println("Success! The object of the class itself is successfully returned from retOb(). The object now contains the string : " + retOb(my_num).num);
}

public static SubMyNumber retOb(MyNumber my_num){
    SubMyNumber sub_my_num= new SubMyNumber("-50");
    sub_my_num.nums=my_num.num;
    return sub_my_num;
}

}

公共类 SubMyNumber 扩展 MyNumber { 字符串数字;

public SubMyNumber( String strs){
    nums=strs;
}   

}

提前致谢。

【问题讨论】:

    标签: java


    【解决方案1】:

    实例化派生类时,必须从基类调用构造函数。
    如果不这样做,Java 将隐式调用默认构造函数。

    如果没有默认构造函数,则会出现该错误。

    【讨论】:

      【解决方案2】:

      来自JLS 8.8.7

      如果构造函数体不是以显式构造函数调用开始,并且被声明的构造函数不是原始类 Object 的一部分,则构造函数体隐式以超类构造函数调用开始 "super();强>",

      由于超类中没有无参数构造函数,因此必须显式调用具有String 参数的构造函数

      【讨论】:

        【解决方案3】:

        由于您没有默认构造函数,因此您必须显式调用它。

        public class SubMyNumber extends MyNumber { 
            String nums;
            public SubMyNumber( String strs){
                super(null); // Or the value you want to superClass
                this.nums=strs;
            }
        

        【讨论】:

        • 但是为什么呢?为什么一定要用超类的构造函数?
        • @user2882662 因为您说SubMyNumberMyNumber,而构造MyNumber 实例的唯一方法是使用带有一个参数的构造函数。
        • 所有类都需要调用超类构造函数。这是为了允许超类实例化它的所有成员。假设您有一个名为Animal 的类,其中包含一个名为getName() 的方法和一个对应的name 变量。您继承 Animal 并创建一个 Cat 类。当您拥有Cat 类的实例时,您可以调用getName()。但如果你不调用超级构造函数,那么name 变量将永远不会被设置。
        【解决方案4】:

        当超类没有默认的空构造函数时,您必须从子类的构造函数中显式调用super

        【讨论】:

          【解决方案5】:

          如果你的类中没有定义构造函数,java 会在内部提供一个默认构造函数,该构造函数进一步用于创建对象。如果您提供自己的构造函数(可以是默认构造函数或参数化构造函数),Java 提供的隐藏构造函数就会丢失。 在您的情况下,您在“MyNumber”中提供了一个参数化构造函数。因此,隐藏的默认构造函数不再可用于从子类的构造函数 (super()) 调用。

          您需要在此代码中做的唯一更改是 1. 除了已经存在的参数化构造函数之外,还提供您自己的默认构造函数。现在,当从 'SubMyNumber' 的参数化构造函数中的第一个 LOC 内部调用 'MyNumber' 类的默认构造函数时,不会有任何错误。

          1. 或者你可以像这样改变子类的参数化构造函数

            public SubMyNumber(String strs){ 超级(strs); 数字=strs; }

          这样你应该显式地设置要调用的 MyNumber 的参数化构造函数,它已经定义了。

          【讨论】:

            猜你喜欢
            • 2014-06-17
            • 2020-09-29
            • 2014-11-06
            • 2023-04-08
            • 1970-01-01
            • 2013-03-03
            • 1970-01-01
            • 1970-01-01
            • 2014-10-02
            相关资源
            最近更新 更多