什么';下面的java代码有什么问题?

什么';下面的java代码有什么问题?,java,inheritance,constructor,Java,Inheritance,Constructor,编译时我遇到一些参数错误。不知道这是怎么回事 我希望输出是bj。由于类a没有默认构造函数,所以在编译时,默认构造函数将由JVM创建。剩下的输出将是bj。我错过什么了吗 class a { a(String b) { System.out.println("this is a"); } } class b extends a { b() { System.out.println("b"); } } class c

编译时我遇到一些参数错误。不知道这是怎么回事

我希望输出是bj。由于类a没有默认构造函数,所以在编译时,默认构造函数将由JVM创建。剩下的输出将是bj。我错过什么了吗

class a
{

    a(String b)
    {
        System.out.println("this is a");
    }
}
class b extends a
{
    b()
    {
        System.out.println("b");
    }
}

class c extends b
{
    c(String j)
    {
        System.out.println(j);
    }
    public static void main(String...k)
    {
        new c("J");
    }
}
错误如下所示:

javac construct.java
construct.java:12: error: constructor a in class a cannot be applied to given ty
pes;
        {
        ^
  required: String
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error
由于类a没有默认构造函数,所以在编译时,默认构造函数将由JVM创建

只有在未定义自定义构造函数时,才会创建默认构造函数

IDE应该在
b()
声明中向您显示以下消息:

“package.a”中没有可用的默认构造函数

当您尝试实例化
b
时,它隐式调用了
super()
,但只找到
a(字符串b)
,而不是
a()
。正如错误消息所说,
a(stringb)
需要一个
String
,但没有参数

解决方案是创建无参数的
a()
构造函数,或者在类
b
构造函数中调用
a(字符串b)
构造函数

class b extends a
{
    b()
    {
        super(""); // call to class a constructor passing some string as argument
        System.out.println("b");
    }
}
由于类a没有默认构造函数,所以在编译时,默认构造函数将由JVM创建

只有在未定义自定义构造函数时,才会创建默认构造函数

IDE应该在
b()
声明中向您显示以下消息:

“package.a”中没有可用的默认构造函数

当您尝试实例化
b
时,它隐式调用了
super()
,但只找到
a(字符串b)
,而不是
a()
。正如错误消息所说,
a(stringb)
需要一个
String
,但没有参数

解决方案是创建无参数的
a()
构造函数,或者在类
b
构造函数中调用
a(字符串b)
构造函数

class b extends a
{
    b()
    {
        super(""); // call to class a constructor passing some string as argument
        System.out.println("b");
    }
}
按照惯例,您应该用大写字母命名Java类

当<代码>新的C(“J”)时,它调用
类C
的构造函数。但随着
类C
扩展
类B
,JVM将添加

C(String j)
{
    super(); //added by JVM - calls the constructor of super class
    System.out.println("j");
}
因此类b的构造函数被调用,同时它也在扩展类A

B()  
{  
   super();  //added by JVM
   System.out.println("b");
}
现在问题出现了。因为JVM将在其隐式调用中添加默认构造函数。但是没有定义没有参数的构造函数。这就是为什么会出现错误。您可以添加
super(“”),以解决错误或创建不带参数的构造函数。

按照惯例,应使用大写字母命名Java类

当<代码>新的C(“J”)时,它调用
类C
的构造函数。但随着
类C
扩展
类B
,JVM将添加

C(String j)
{
    super(); //added by JVM - calls the constructor of super class
    System.out.println("j");
}
因此类b的构造函数被调用,同时它也在扩展类A

B()  
{  
   super();  //added by JVM
   System.out.println("b");
}

现在问题出现了。因为JVM将在其隐式调用中添加默认构造函数。但是没有定义没有参数的构造函数。这就是为什么会出现错误。您可以添加
super(“”)以解决错误或创建不带参数的构造函数。

只有在不编写自己的构造函数时,才会创建默认构造函数
a
有一个构造函数使用
字符串,因此没有默认构造函数。编译错误是什么?您应该从b的cunstructor中调用超类构造函数:super(“某个字符串”)@kartic:如果我在b中使用super,它将被成功编译。但在这里,我知道在一个函数中没有任何默认构造函数。如果程序员不这样做,那么解决方案是什么呢?我怀疑这是否可行。但我很好奇,这实际上是否可能——您正在扩展一个类,而您不知道超级类构造函数?只是好奇。默认构造函数只有在您不编写自己的构造函数时才会创建
a
有一个构造函数使用
字符串,因此没有默认构造函数。编译错误是什么?您应该从b的cunstructor中调用超类构造函数:super(“某个字符串”)@kartic:如果我在b中使用super,它将被成功编译。但在这里,我知道在一个函数中没有任何默认构造函数。如果程序员不这样做,那么解决方案是什么呢?我怀疑这是否可行。但我很好奇,这实际上是否可能——您正在扩展一个类,而您不知道超级类构造函数?只是好奇。同意。如果我在b中使用super,它会被成功编译。但在这里,我知道在类a中没有任何默认构造函数。如果程序员不知道这一点(大约有一个超级类),那么解决方案将是什么——程序员应该知道@kTiwari。如果您正在扩展类A,则应记录A的构造函数。@kTiwari您的IDE应在b()上显示以下错误:“package.A中没有可用的默认构造函数”。所以程序员已经被警告了这个问题。同意。如果我在b中使用super,它将被成功编译。但在这里,我知道在类a中没有任何默认构造函数。如果程序员不知道这一点(大约有一个超级类),那么解决方案将是什么——程序员应该知道@kTiwari。如果您正在扩展类A,则应记录A的构造函数。@kTiwari您的IDE应在b()上显示以下错误:“package.A中没有可用的默认构造函数”。所以程序员已经被警告了这个问题。