什么';下面的java代码有什么问题?
编译时我遇到一些参数错误。不知道这是怎么回事 我希望输出是bj。由于类a没有默认构造函数,所以在编译时,默认构造函数将由JVM创建。剩下的输出将是bj。我错过什么了吗什么';下面的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
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”)当执行code>时,它调用类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(“”)在构造函数B中编码>,以解决错误或创建不带参数的构造函数。按照惯例,应使用大写字母命名Java类
当<代码>新的C(“J”)当执行code>时,它调用类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(“”)在构造函数B中编写>以解决错误或创建不带参数的构造函数。只有在不编写自己的构造函数时,才会创建默认构造函数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中没有可用的默认构造函数”。所以程序员已经被警告了这个问题。