隐式超级构造函数Num()未定义默认构造函数。必须定义一个显式构造函数,这背后的逻辑是什么?

3
class Num 
{
    Num(double x) 
    { 
        System.out.println( x ) ; 
    }
}
class Number extends Num 
{ 
    public static void main(String[] args)
    { 
        Num num = new Num(2) ; 
    } 
} 

在上面的程序中,出现了错误。请帮我解决。

1
Java错误:默认构造函数的隐式超类构造函数未定义的副本。 - Raghuram
只需为Num添加一个无参构造函数。 - Darshan Lila
但这里的主要问题是你为什么要这样做?这根本没有任何意义... - Henrique Barcelos
@tobias_k 我没有看到 Number 作为嵌套类。 - Kumar Abhinav
@AbhinavKumar 你是对的,只是缩进有误导性(现已编辑)。 - tobias_k
3个回答

6

当您定义自己的构造函数时,编译器不会为您提供无参构造函数。当您定义一个没有构造函数的类时,编译器会为您插入一个调用super()的无参构造函数。

class Example{
}

变成

class Example{

Example(){
super();   // an accessible no-arg constructor must be present for the class to compile.
}

然而,对于您的Number类而言情况并非如此,因为Num类找不到无参构造函数。您需要显式定义一个构造函数,并调用任何一个超级构造函数。

解决方案:

class Num 
{
    Num(double x) 
    { 
        System.out.println( x ) ; 
    }
}

class Number extends Num 
{ 


 Number(double x){
 super(x);
 }

 public static void main(String[] args)
    { 
        Num num = new Num(2) ; 
    } 
} 

0

你的构造函数是为类double定义的,但你使用整数参数调用了Num。整数不会自动转换为双精度浮点数,并且你没有默认构造函数,因此会出现编译错误。


0

正如Asalynd正确地回答了这个问题。 您的构造函数是为double类定义的,但您使用整数参数调用Num。整数不会自动提升为双精度浮点数,并且您没有默认构造函数,因此会出现编译错误。在传递参数之前,您必须进行类型转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接