java - 在抽象类中声明具体方法

标签 java abstract overriding 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() 的(完全相同)实现在每个具体类的实现中。

这种方法有什么问题吗?

编辑:我得到的异常(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/

相关文章:

maven - 如何覆盖默认的 maven-install-plugin 行为?

在编译器或类型检查器 (javac) 中导致堆栈溢出的 Java 片段?

java - 如何在Java主类中使用DAO模块?

java - 如何在 GUI 上放置基于 system.out.print 的文本界面? - JAVA -

Java - 强制继承 N 个重写抽象方法中的 1 个

c# - C#中 'abstract override'有什么用?

c++ - 为什么基类对象必须是引用才能调用派生虚函数?

java - 将表单值存储在操作类的 bean 中

java - 实现一个接口(interface),该接口(interface)有一个返回接口(interface)的方法,但收到未实现的错误

c# - 为什么 C# 接口(interface)方法没有声明为抽象或虚拟?