Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在子类内创建父对象时出错_Java_Inheritance_Constructor - Fatal编程技术网

Java 在子类内创建父对象时出错

Java 在子类内创建父对象时出错,java,inheritance,constructor,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); } } 错误:-默认构造函数的

我有两个班:-

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()未定义。必须定义显式构造函数。

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

B() {
    super();
}

由于
A
没有接受零参数的构造函数,
B
无法编译。您需要向
B
添加一个调用
super(int)
的构造函数,或者需要向
a
添加一个零参数构造函数。问题是在
B
中没有声明构造函数,因此编译器提供了默认构造函数,实际上如下所示:

B() {
    super();
}

由于
A
没有接受零参数的构造函数,
B
无法编译。您需要向调用
super(int)
B
添加一个构造函数,或者您需要向
a
添加一个零参数构造函数。您已经为具有int参数的类指定了自己的构造函数。现在您还需要向类B添加一个构造函数

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

您已经为一个参数为int的类提供了自己的构造函数。现在您还需要为类B添加一个构造函数

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

原则

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

默认情况下,如果不声明无参数构造函数,编译器将生成无参数构造函数。
重要详细信息:此生成的构造函数使用无参数调用调用父构造函数


您的案例

您没有在B中声明构造函数。
因此,将生成默认的无参数构造函数B:

此构造函数是:

B(){
   super();
}
但它不能调用父构造函数,因为它声明了一个参数:

 public A(int number) 
因此编译器发出以下错误:

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

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

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

原则

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

默认情况下,如果不声明无参数构造函数,编译器将生成无参数构造函数。
重要详细信息:此生成的构造函数使用无参数调用调用父构造函数


您的案例

您没有在B中声明构造函数。
因此,将生成默认的无参数构造函数B:

此构造函数是:

B(){
   super();
}
但它不能调用父构造函数,因为它声明了一个参数:

 public A(int number) 
因此编译器发出以下错误:

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

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

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

我认为您在
A
类中缺少了
默认构造函数。

请参阅以获得进一步解释。

我认为您在
A
类中缺少了
默认构造函数。
有关详细说明,请参见。

添加构造函数B(int):

加:

添加构造函数B(int):

加:


如果不在Java中定义构造函数,则会得到一个隐式默认构造函数。定义构造函数时,默认构造函数就不存在了。所以,当你有这样的事情:

Class A {

}
这相当于:

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

在您的例子中,类B正在调用A的默认构造函数,但由于A已经定义了另一个构造函数,因此默认构造函数不再存在,除非您显式定义它。

如果您没有在Java中定义构造函数,则会得到隐式默认构造函数。定义构造函数时,默认构造函数就不存在了。所以,当你有这样的事情:

Class A {

}
这相当于:

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

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

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

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

请求帮助时,请花时间合理且易读地格式化和缩进代码。(在不寻求帮助时,这也是个好主意。)(这次我帮你做了。)注意,
import java.lang.*没有意义这是默认导入的。通常是Eclipse或其他IDE,如果您在请求帮助时将鼠标移到编译错误上,请花时间合理且可读地格式化和缩进您的代码。(在不寻求帮助时,这也是个好主意。)(这次我帮你做了。)注意,
import java.lang.*没有意义这是默认导入的。通常是像Eclipse或其他IDE,如果将鼠标移到编译错误上,请给出关于此类错误的提示。请解释为什么它调用B的构造函数。创建父类对象时。@shankardayalupadhay:不是。你不会走那么远的。代码无法编译。在编译代码之前,您不能运行代码。如果添加一个
B
构造函数,该构造函数采用调用
super(int)
int
,则代码将编译。什么时候