我需要覆盖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()
的(完全相同)实现在每个具体类的实现中。
这种方法有什么问题吗?
编辑:我得到的异常(exception)是 NullPointerException
然后我指向 ClassA.toString()
.
最佳答案
不要将 name
声明为 ClassB
上的字段,而是在 ClassB
的构造函数中分配 someEnum
,以便它使用来自父类(super class)型的字段。父类(super class)型无法访问子类型的 name
字段,这会在调用 toString
时导致 NPE。
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);
}
}
关于java - 在抽象类中声明具体方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16315287/