这是我的程序:
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(){
}
}
}
但我不明白为什么?
感谢您的帮助。
最佳答案
因为你的A
类声明了一个构造函数
A(int a){
}
然后任何想要实例化 A
的代码都需要使用该构造函数来实现。有点像
A a = new A(42);
您还声明了一个子类 B
。由于 B
是一个 A
,除了它的构造函数之外,它还必须调用父类的构造函数。这是由编译器隐式完成的。说你有
class A{
A(){
}
class B extends A{
B(){
// super(); injected by compiler
}
}
如果您没有无参数构造函数,那么编译器就不知道要注入(inject)哪个构造函数调用。您需要显式声明 super(...)
调用。
class A{
A(int a){
}
class B extends A{
B(){
super(42);
}
}
这样想:如果不调用构造函数,就无法构造A
。当您构造一个 B
时,您通过继承也构造了一个 A
,因此您需要调用相同的构造函数。
关于java - java中的继承(编译错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20179376/