我需要为我的抽象类的所有具体方法重写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()
。
答案 0 :(得分:2)
而不是将name
声明为ClassB
中someEnum
的构造函数中的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);
}
}