隐式超类构造函数MyNumber()未定义。必须调用另一个构造函数

时间:2013-10-28 19:07:14

标签: java

我收到以下代码中标题中提到的错误。请告诉我为什么我会收到此错误,虽然我没有从超类中调用默认构造函数MyNumber(),以及如何解决它。

package referencereturntype;

public class 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 {     字符串nums;

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

}

提前致谢。

5 个答案:

答案 0 :(得分:1)

由于您没有默认构造函数,因此必须将其明确调用。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

来自JLS 8.8.7

  

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

    public SubMyNumber(String strs){     超级序列(STR);     NUMS =可疑交易; }

  2. 这样你就可以显式设置要调用的MyNumber的参数化构造函数。