这是我的程序:
class A{
A(int a){
}
class B extends A{
B(){
}
}
}
当我编译时,我有一个错误:
C:UsersPublicDocumentsAB.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(){
}
}
}
但我不明白为什么?
谢谢你的帮助。
由于A
类声明了一个构造函数
A(int a){
}
那么任何想要实例化CCD_ 2的代码都需要使用该构造函数。类似的东西
A a = new A(42);
您还声明了一个子类B
。由于B
是A
,除了它的构造函数外,它还必须调用父类的构造函数。这是由编译器隐式完成的。假设你有
class A{
A(){
}
class B extends A{
B(){
// super(); injected by compiler
}
}
如果没有无arg构造函数,那么编译器就不知道要注入哪个构造函数调用。您需要显式声明super(...)
调用。
class A{
A(int a){
}
class B extends A{
B(){
super(42);
}
}
这样想:如果没有构造函数调用,就无法构造A
。当您构造B
时,通过继承,您也在构造A
,因此您需要相同的构造函数调用。
您需要在a中有一个默认构造函数(无参数)。任何类的构造函数的第一个隐式调用是super()
。但是在超类中没有super()
方法。您可以显式调用super(5)
或某个值,也可以在a:中创建默认构造函数
A() {}
创建类B
的实例时,将对super()
构造函数进行不带参数的默认调用。除非显式提供了不同的构造函数,否则每个类都有一个不带参数的默认构造函数。
由于您已经显式地为类A
提供了一个接受一个参数的构造函数,因此它不再具有不带参数的默认构造函数,因此您需要定义它。
每当我们扩展一个类时,默认情况下它会调用super()(它没有参数)。在您的情况下,它强制获得匹配的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
}
}
}