调用抽象类的构造函数

时间:2014-05-27 13:42:11

标签: java inheritance

说我有以下类结构:

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中的代码不应该是一个方法,它应该是一个构造函数)

2 个答案:

答案 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
    }
}

当然,它有点冗长和样板,但它可以让你避免重复任何功能