为什么不抽象字段?

2022-08-31 09:07:10

为什么Java类不能像抽象方法那样具有抽象字段?

例如:我有两个类扩展相同的抽象基类。这两个类都有一个相同的方法,除了其中的 String 常量(恰好是错误消息)除外。如果字段可以是抽象的,我可以使这个常量抽象,并将方法拉到基类中。相反,我必须创建一个抽象方法(在本例中称为),该方法返回 String,在两个派生类中重写此方法,然后我可以提取该方法(现在调用抽象方法)。getErrMsg()

为什么我不能一开始就把这个领域抽象出来呢?Java可以被设计成允许这样做吗?


答案 1

您可以通过在抽象类中具有在其构造函数(未经测试的代码)中初始化的最终字段来执行您所描述的操作:

abstract class Base {

    final String errMsg;

    Base(String msg) {
        errMsg = msg;
    }

    abstract String doSomething();
}

class Sub extends Base {

    Sub() {
        super("Sub message");
    }

    String doSomething() {

        return errMsg + " from something";
    }
}

如果子类“忘记”通过超级构造函数初始化 final,编译器将发出错误警告,就像未实现抽象方法一样。


答案 2

我认为这毫无意义。您可以将函数移动到抽象类,然后只重写一些受保护的字段。我不知道这是否适用于常量,但效果是相同的:

public abstract class Abstract {
    protected String errorMsg = "";

    public String getErrMsg() {
        return this.errorMsg;
    }
}

public class Foo extends Abstract {
    public Foo() {
       this.errorMsg = "Foo";
    }

}

public class Bar extends Abstract {
    public Bar() {
       this.errorMsg = "Bar";
    }
}

所以你的观点是,你想在子类中强制实施/覆盖/任何东西?我以为你只是想在基类中拥有方法,当时不知道如何处理这个领域。errorMsg