Java 无法访问祖父母类构造函数
我创建了3个类,如下所示:Java 无法访问祖父母类构造函数,java,android,Java,Android,我创建了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(){
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)梯度:错误:类B中的构造函数B不能为
适用于给定类型;必需:未找到参数:int原因:
实际参数列表和形式参数列表的长度不同
如果这个问题是因为我对OOP的无知,我很抱歉,但是我真的被阻碍了,我真的需要你们的帮助。多谢各位 在错误的位置调用
B
的单参数构造函数。但是,B
没有单参数构造函数。它只有零参数默认构造函数
您需要将零参数和单参数构造函数添加到类
B
构造函数不会被子类继承。这意味着B
不会继承A
的两个构造函数。每当您不创建任何显式构造函数时,Java编译器就会创建一个隐式默认构造函数,该构造函数不接受任何参数,除了隐式调用超类构造函数之外,什么也不做
B
中的默认构造函数是C
中的第一个构造函数工作的原因。它使用super()
显式调用它。但是由于没有采用int
的B
构造函数,因此在C
中调用super(x)
是一个错误
创建显式构造函数
B(int)
时,将调用super(x)
在C
的第二个构造函数中编译。因为现在您将有一个显式构造函数,不再有隐式默认构造函数,所以您还必须在B
中创建一个显式无参数构造函数,这样C
中对super
的第一个构造函数的调用仍将编译。我做了类似B(int x){super(x)}
作为临时解决方案!然而,如果我在类a中有更多的构造函数,比如:public a(intx,boolean-choice){if(choice)this.x=x;else x=0;}
并且想要在类C中扩展它,那么我必须在类B中创建一个构造函数,它看起来非常冗余!我对类B感到好奇,它仍然接受类A的构造函数作为它的构造函数,比如BB=newB(10)代码>仍在工作。那么为什么C不能访问这种构造函数呢?