无法访问祖父母类构造函数

时间:2018-07-30 16:43:58

标签: 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(){
      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的无知而引起的,我感到非常抱歉,但是我真的很受阻,请您诚实地寻求帮助。非常感谢你!

2 个答案:

答案 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添加一个零参数和一个参数构造器。