为什么Java类不能既抽象又是最终的

本文关键字:抽象 Java 不能 为什么 | 更新日期: 2023-09-27 18:33:28

假设我有一个只包含静态方法和变量的实用程序类。 例如:

public abstract final class StringUtils
{
    public static final String NEW_LINE = System.getProperty("line.separator");
    public static boolean isNotNullOrSpace(final String string)
    {
        return !(string == null || string.length() < 1 || string.trim().length() < 1);
    }
}

在这种情况下,使类既抽象又最终是有意义的。抽象,因为创建此类的对象将没有用,因为所有方法都可以静态访问。Final 是因为派生类不能从此类继承任何内容,因为它没有任何非静态成员。

C# 允许对此类类使用静态修饰符。为什么 Java 不支持这个?

为什么Java类不能既抽象又是最终的

这是不可能的,因为 Java 语言规范声明:

声明抽象类类型是一个编译时错误,例如不可能创建一个实现其所有抽象方法 [1]

除此之外,没有内在的理由说明抽象的最终类是不合逻辑的 - 抽象一词通常与具体相反,表示不存在类型的直接实例。

final类不能扩展,需要扩展abstract类才能实例化。因此,final abstract类将是一个逻辑矛盾。

如果你的类只有static方法,也许你应该通过将其定义为privatehide它的构造函数.-

private StringUtils() {
}

除了主观性之外,没有其他原因,但你可以通过以下方式实现相同的目标 使你的类抽象,并使你所有的方法最终化。喜欢:

public abstract class MyClass {
    …
    public final static void myMethod1() {
        …
    }
    public final static void myMethod2() {
        …
    }
}

编译器将检查这一点,并在您尝试实例化MyClass的对象时给出错误,并且当任何子类扩展MyClass时,也无法覆盖最终方法

当我们将一个类声明为抽象时,它不能被实例化。当我们声明一个类为 final 时,它不能被继承。要实现抽象中的方法,需要继承类。但是如果我们声明一个类为 final,则该类不能被继承。因此,我们不能将一个类声明为抽象类和最终

由于某些特定原因,我们不能在抽象类中使用 final 关键字。

  1. 如果我们定义抽象的最终,那么我们就不能扩展它。
  2. 抽象类旨在由其他一些类继承并提供非具体方法的实现。
  3. 如果我们将抽象类定义为最终的,它将给出编译时错误。

一个方法永远不能被标记为抽象和最终,或两者兼而有之抽象和私密。想一想 — 必须实现抽象方法(这本质上意味着被子类覆盖),而最终和私有方法永远不能被子类重写。或者换一种说法,一个抽象名称意味着超类不知道如何子类应该在该方法中运行,而最终指定意味着超类知道所有子类(无论在继承树)应该在该方法中运行。摘要和最终修饰符实际上是相反的。因为私有方法甚至不能被子类(更不用说继承)看到,它们也不能被覆盖,所以它们也是不能标记为抽象。

在 Java 中,不能创建抽象类的实例,我们只能有抽象类类型的引用。因此,如果我们使抽象类最终化,那么我们将无法扩展它。抽象和最终是相互排斥的概念。这就是为什么 Java 编译器在尝试在 Java 中使抽象类最终化时会抛出编译时错误的原因