在抽象类中声明具体方法

时间:2013-05-01 08:52:01

标签: java abstract overrides abstract-methods

我需要为我的抽象类的所有具体方法重写toString()方法 - 在所有情况下都完全相同。所以这就是我想要做的事情(SomeEnum是一个单独的类,只有一个枚举声明):

抽象类

public abstract class ClassA {
    protected SomeEnum name;
    protected int some_int;

// Constructor here

@Override
public String toString() {
    return name.toString().toLowerCase() + " > " + Integer.toString(some_int);
}
}

具体课程(示例)

public class ClassB extends ClassA {
    private static final int some_const = 1;
    private SomeEnum name = SomeEnum.ENUM_1;

public ClassB(int some_int) {
    super(some_const, some_int);
}
}

出于某种原因,我不能这样做,没有运行时异常,我需要在抽象类中声明抽象方法,然后在每个方法中提供toString()的(完全相同的)实现具体类实现。

这种方法有什么问题?

编辑:我得到的例外是NullPointerException,然后我指向ClassA.toString()

1 个答案:

答案 0 :(得分:2)

而不是将name声明为ClassBsomeEnum的构造函数中的ClassB字段,因此它使用超类型中的字段。超类型无法访问子类型上的name字段,这会在调用toString时导致NPE。

public ClassB(int some_int) {
    super(some_const, some_int);
    this.name = SomeEnum.ENUM_1;
}

完整示例

<强> ClassB的

public class ClassB extends ClassA {
    private static final int some_const = 1;

    public ClassB(int some_int) {
        super(some_const, some_int);
        this.name = SomeEnum.ENUM_1;
    }

    public static void main(String[] args) {
        ClassB b = new ClassB(4);
        b.toString();
    }
}

<强> ClassA的

public abstract class ClassA {
    protected SomeEnum name;
    protected int some_int;

    public ClassA(int someConst, int some_int2) {
    }

    @Override
    public String toString() {
        return name.toString().toLowerCase() + " > "
                + Integer.toString(some_int);
    }

}