在子类中创建Parent对象时出错

时间:2017-08-14 08:30:10

标签: java inheritance constructor

我有两节课: -

import java.lang.*;
class A {
    public A(int number) {
        System.out.println("HI I AM INSIDE PARENT CONSTRUCTOR");
    }
}
class B extends A {
    public static void main(String[] args) {
        A obj = new A(10);
    }
}

错误: - 默认构造函数未定义隐式超级构造函数A()。必须定义一个显式的构造函数。

7 个答案:

答案 0 :(得分:2)

问题是你没有在B中声明构造函数,因此编译器提供了默认构造函数,实际上如下所示:

B() {
    super();
}

由于A没有构造函数接受零参数,因此无法编译B。您需要向调用B的{​​{1}}添加构造函数,否则您需要向super(int)添加零参数构造函数。

答案 1 :(得分:2)

<强>原理

子类构造函数必须调用父构造函数。

默认情况下,如果您没有声明,则编译器会生成一个无参数构造函数。
重要细节:这个生成的构造函数使用no arg调用来调用父构造函数。

您的案例

你不能在B中声明一个构造函数。
因此,生成了B的默认无arg构造函数:

这个构造函数是:

B(){
   super();
}

但它无法调用父构造函数,因为它声明了一个参数:

 public A(int number) 

因此编译器会发出此错误:

  

默认构造函数未定义隐式超类构造函数A()。   必须定义一个显式的构造函数。

要解决您的问题,请在子类中声明一个构造函数,该构造函数使用期望的参数显式调用父构造函数:

public B(int number) {
   super(number);
}

答案 2 :(得分:0)

你为A提供了自己的构造函数,其参数为int。现在你需要自己添加一个构造函数给B类。

A

答案 3 :(得分:0)

我认为你错过了default constructor课程中的A。 有关详细说明,请参阅this answer

答案 4 :(得分:0)

添加构造函数B(int):

import java.lang.*;

class A {
    public A(int number) {
        System.out.println("HI I AM INSIDE PARENT CONSTRUCTOR");
    }
}

class B extends A {
    public B(int number) { 
        super(number);
    }

    public static void main(String[] args) {
        A obj = new A(10);
    }
}

添加:

public B(int number) { 
    super(number);
}

答案 5 :(得分:0)

如果未在Java中定义构造函数,则会获得隐式默认构造函数。定义构造函数时,默认构造函数不再存在。所以,当你有类似的东西时:

Class A {

}

这相当于:

Class A {
    A() {
        super();
    }
}

在你的情况下,B类正在调用A的默认构造函数,但由于A已经定义了另一个构造函数,因此默认构造函数不再存在,除非您明确定义它。

答案 6 :(得分:0)

因为你已经在父类中定义了一个带有参数的构造函数,所以编译器不会在没有参数的情况下调用默认构造函数。为了在子类初始化之前实例化父类,你必须调用父类的显式子类中的构造函数。