8

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

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不支持这个?

4

7 回答 7

16

这是不可能的,因为 Java 语言规范指出:

声明抽象类类型是编译时错误,因此无法创建实现其所有抽象方法的子类[1]

除此之外,抽象最终类不合逻辑没有内在原因 -抽象一词通常用于与具体相反,表示可能不存在类型的直接实例。

这与抽象方法不能具有私有访问修饰符的原因相同。

于 2014-10-24T15:27:25.200 回答
13

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

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

private StringUtils() {
}
于 2013-10-01T07:29:47.347 回答
1

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

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

    public final static void myMethod2() {
        …
    }
}

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

于 2014-04-12T22:04:28.463 回答
0

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

  1. 如果我们定义 abstract final 那么我们不能扩展它。
  2. 抽象类意味着被其他一些类继承并提供非具体方法的实现。
  3. 如果我们将抽象类定义为最终类,它将给出编译时错误..
于 2018-12-31T04:24:57.323 回答
0

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

于 2021-10-24T16:06:53.597 回答
-1

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

于 2015-11-24T10:16:21.307 回答
-1

在Java中不能创建抽象类的实例,我们只能有抽象类类型的引用。因此,如果我们将抽象类设为 final,那么我们将无法扩展它。abstract 和 final 是互斥的概念。这就是为什么当您尝试在 Java 中创建一个抽象类时,Java 编译器会抛出编译时错误

于 2018-12-23T18:49:05.173 回答