0

我在以下代码中收到标题中提到的错误。请告诉我为什么会收到此错误,尽管我没有在任何地方从超类调用默认构造函数 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 { String nums;

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

}

提前致谢。

4

5 回答 5

1

JLS 8.8.7

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

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

于 2013-10-28T19:15:34.260 回答
1

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

public class SubMyNumber extends MyNumber { 
    String nums;
    public SubMyNumber( String strs){
        super(null); // Or the value you want to superClass
        this.nums=strs;
    }
于 2013-10-28T19:08:42.697 回答
1

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

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

于 2013-10-28T19:09:26.443 回答
0

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

于 2013-10-28T19:09:38.213 回答
0

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

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

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

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

这样,您将显式设置要调用的 MyNumber 的参数化构造函数,该构造函数已定义。

于 2015-09-16T10:37:11.307 回答