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
,则代码将编译。什么时候