java中的继承(编译错误)



这是我的程序:

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。由于BA,除了它的构造函数外,它还必须调用父类的构造函数。这是由编译器隐式完成的。假设你有

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
   }
 }
 }

最新更新