说我有以下类结构:
public class A{
A(int a){
...
}
}
abstract class B extends A{
}
public class C extends B{
C(int a){
super(a);
}
}
此代码在myMethod不会调用A的构造函数的意义上无效。有没有办法做到这一点?
我最终想要做的是在不影响其功能的情况下为一组类添加功能。所有这些类当前都扩展了一个公共类(runtimeException),因此我考虑添加一个中间抽象类。
(编辑:C中的代码不应该是一个方法,它应该是一个构造函数)
答案 0 :(得分:6)
您将无法像您所写的那样声明课程B
。要创建B
的实例,您需要调用A
构造函数:
public abstract class B extends A {
public B() {
super(10); //or other number
}
}
public class C extends B {
public C(int a) {
super();
}
}
换句话说,你总是调用“上一级”的构造函数,无论该类是否是抽象的。
为了避免这个奇怪的数字10
我写了int
构造函数的C
参数,我建议添加到子类构造函数至少所有参数父类构造函数需要任何extends
个类。
答案 1 :(得分:2)
我通常看到的是这样的模式:
public class A{
A(int a){
...
}
}
abstract class B extends A{
B(int a) {// "proxy" constructor"
super(a);
}
}
public class C extends B{
C(int a) {
super(a);
}
void myMethod(int a){
// super(a); <- note this is invalid code, you can only call this from the constructor
new C(0); // <-- this is valid
}
}
当然,它有点冗长和样板,但它可以让你避免重复任何功能