我已经创建了3个类,如下所示:
public class A{
protected int x;
public A(){
this.x=0;
}
public A(int x){
this.x=x;
}
public void doSomething(){
x=1;
}
}
public class B extends A{
@Override
public void doSomething(){
x=2;
}
}
public class C extends B{
protected int y;
public C(){
super();
y=0;
}
public C(int x, int y){
super(x);//Error
this.y=y;
}
@Override
public void doSomething(){
x=3;
y=3;
}
}
我的IDE(Android Studio)返回此错误:
错误:(26,8)Gradle:错误:类B中的构造函数B不能为 适用于给定的类型;必需:未找到参数:整数原因: 实际和正式论证清单的长度不同
如果这个问题是由于我对OOP的无知而引起的,我感到非常抱歉,但是我真的很受阻,请您诚实地寻求帮助。非常感谢你!
答案 0 :(得分:1)
构造函数不被子类继承。这意味着B
不会继承A
的两个构造函数。每当您不创建任何显式构造函数时,Java编译器都会创建一个隐式默认构造函数,该构造函数不带任何参数,除了隐式调用超类构造函数外,不执行任何操作。
B
中的默认构造函数是C
中第一个构造函数起作用的原因。它使用super()
显式调用它。但是,由于没有B
构造函数采用int
,因此super(x)
中对C
的调用是错误的。
创建显式构造函数B(int)
时,将获得对super(x)
的调用以在C
的第二个构造函数中进行编译。因为您现在将拥有一个显式构造函数,所以将不再有一个隐式默认构造函数,因此您还必须在B
中创建一个显式的无参数构造函数,以便对super
的调用在C
的第一个构造函数中仍然可以编译。
答案 1 :(得分:0)
在错误的地方,调用了B
的一个参数构造函数。但是,B
没有一个参数构造函数。它只有零参数的默认构造函数。
您需要为类B
添加一个零参数和一个参数构造器。