java中的继承(编译错误)

时间:2013-11-24 18:47:31

标签: java oop

这是我的计划:

class A{
    A(int a){
    }

class B extends A{
    B(){    
    }
}

}

当我编译时出现错误:

C:\Users\Public\Documents\AB.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(){
        }
    }
}

但我不明白为什么?

感谢您的帮助。

4 个答案:

答案 0 :(得分:6)

由于您的A类声明了构造函数

A(int a){
}

然后任何想要实例化A的代码都需要使用该构造函数来实现。{p>像

这样的东西
A a = new A(42);

您还声明了一个子类B。由于BA,因此除了构造函数之外,它还必须调用父类&#39}。构造函数。这是由编译器隐式完成的。说你有

class A{
    A(){
    }

class B extends A{
    B(){
        // super(); injected by compiler
    }
}

如果你没有no-arg构造函数,那么编译器就不知道要注入哪个构造函数。您需要明确声明super(...)电话。

class A{
    A(int a){
    }

class B extends A{
    B(){    
        super(42);
    }
}

这样想:你不能在没有构造函数调用的情况下构造A。构造B时,通过继承,您还构造了A,因此您需要相同的构造函数调用。

答案 1 :(得分:0)

你需要在A中有一个默认构造函数(无参数)。任何类的构造函数的第一个隐式调用是super()。但是超类中没有super()方法。您可以显式调用super(5)或某个值,也可以在A:

中创建默认构造函数
A() {}

答案 2 :(得分:0)

当创建类B的实例时,会对没有参数的super()构造函数进行默认调用。除非明确提供不同的构造函数,否则每个类都有一个没有参数的默认构造函数。

由于您已明确地为类A提供了一个带有一个参数的构造函数,因此它不再具有没有参数的默认构造函数,因此您需要定义它。

答案 3 :(得分:0)

每当我们扩展一个类时,默认情况下它会调用super()(它没有params)。在你的情况下,它得到匹配的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
   }
 }

 }