这是我的计划:
class A{
A(int a){
}
class B extends A{
B(){
}
}
}
当我编译时出现错误:
C:\Users\Public\Documents\AB.java:6: error: constructor A in class A cannot be applied to given types;
B(){
^
required: int
found: no arguments
reason: actual and formal argument lists differ in length
并通过我的代码中的此更改来修复:
class A{
A(int a){
}
A(){
}
class B extends A{
B(){
}
}
}
但我不明白为什么?
感谢您的帮助。
答案 0 :(得分:6)
由于您的A
类声明了构造函数
A(int a){
}
然后任何想要实例化A
的代码都需要使用该构造函数来实现。{p>像
A a = new A(42);
您还声明了一个子类B
。由于B
是A
,因此除了构造函数之外,它还必须调用父类&#39}。构造函数。这是由编译器隐式完成的。说你有
class A{
A(){
}
class B extends A{
B(){
// super(); injected by compiler
}
}
如果你没有no-arg构造函数,那么编译器就不知道要注入哪个构造函数。您需要明确声明super(...)
电话。
class A{
A(int a){
}
class B extends A{
B(){
super(42);
}
}
这样想:你不能在没有构造函数调用的情况下构造A
。构造B
时,通过继承,您还构造了A
,因此您需要相同的构造函数调用。
答案 1 :(得分:0)
你需要在A中有一个默认构造函数(无参数)。任何类的构造函数的第一个隐式调用是super()
。但是超类中没有super()
方法。您可以显式调用super(5)
或某个值,也可以在A:
A() {}
答案 2 :(得分:0)
当创建类B
的实例时,会对没有参数的super()
构造函数进行默认调用。除非明确提供不同的构造函数,否则每个类都有一个没有参数的默认构造函数。
由于您已明确地为类A
提供了一个带有一个参数的构造函数,因此它不再具有没有参数的默认构造函数,因此您需要定义它。
答案 3 :(得分:0)
每当我们扩展一个类时,默认情况下它会调用super()(它没有params)。在你的情况下,它得到匹配的A(),因此它导致编译器错误。 每当你写这篇文章时,内部会发生什么:
class A
{
A(int a)
{
}
class B extends A
{
B()
{
//Internally compiler calls super()
super();//In your case, it dint get the matching constructor
}
}
}