2

我需要为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().

4

1 回答 1

2

而不是在构造函数中声明nameClassBassign的字段,因此它使用超类型中的字段。超类型无权访问子类型上的字段,这会在调用时导致 NPE 。someEnumClassBnametoString

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

完整示例

B类

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();
    }
}

A类

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);
    }

}
于 2013-05-01T08:57:58.087 回答