编译时我遇到了一些参数错误。不知道这有什么不妥。
我原以为输出会是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
答案 0 :(得分:4)
因为类a没有默认构造函数所以在编译时默认构造函数将由JVM创建
只有在未定义自定义构造函数时才会创建默认构造函数。
您的IDE应该在b()
声明中显示以下消息:
'包 .a'
中没有默认构造函数
当您尝试实例化b
时,它会对super()
进行隐式调用,但只找到a(String b)
而不是a()
。正如错误消息所示,a(String b)
期望String
但没有参数。
解决方案是创建无参数a()
构造函数或调用类a(String b)
构造函数中的b
构造函数。
class b extends a
{
b()
{
super(""); // call to class a constructor passing some string as argument
System.out.println("b");
}
}
答案 1 :(得分:0)
按照惯例,您应该使用大写字母命名Java类
执行new C("J");
时,它会调用class C
的构造函数。但是当class C
扩展class B
时,JVM将添加
C(String j)
{
super(); //added by JVM - calls the constructor of super class
System.out.println("j");
}
因此调用了类b的构造函数,因为它也在扩展class A
。
B()
{
super(); //added by JVM
System.out.println("b");
}
现在出现了问题。由于JVM将在其隐式调用中添加默认构造函数。但是没有使用无参数定义的构造函数。这就是你收到错误的原因。您可以在构造函数B中添加super("");
以解决错误或创建不带参数的构造函数。