这是我的计划:
class A{
A(int a){
}
class B extends A{
B(){
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我编译时,我有一个错误:
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
Run Code Online (Sandbox Code Playgroud)
它由我的代码中的此更改修复:
class A{
A(int a){
}
A(){
}
class B extends A{
B(){
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么?
谢谢你的帮助.
因为你的A类声明了一个构造函数
A(int a){
}
Run Code Online (Sandbox Code Playgroud)
那么任何想要实例化的代码都A需要使用该构造函数来实现.就像是
A a = new A(42);
Run Code Online (Sandbox Code Playgroud)
您还声明了一个子类B.因为它B是一个A,除了它的构造函数,它必须调用父类的构造函数.这是由编译器隐式完成的.说你有
class A{
A(){
}
class B extends A{
B(){
// super(); injected by compiler
}
}
Run Code Online (Sandbox Code Playgroud)
如果你没有no-arg构造函数,那么编译器不知道要注入哪个构造函数.您需要明确声明super(...)调用.
class A{
A(int a){
}
class B extends A{
B(){
super(42);
}
}
Run Code Online (Sandbox Code Playgroud)
可以这样想:没有构造A函数调用就无法构造一个.当你构造一个B,你通过继承,也构造一个A,所以你需要相同的构造函数调用.