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

时间:2013-10-01 07:26:12

标签: c# java static abstract-class final

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

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);
    }
}

在这种情况下,使类既抽象又最终是有意义的。摘要因为制作这个类的对象没有用,因为所有方法都是静态访问的。最后因为派生类不能从该类继承任何内容,因为它没有任何非静态成员。

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

6 个答案:

答案 0 :(得分:13)

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

  

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

除此之外,没有固有的理由说明抽象的最终类不合逻辑 - abstract 这个词通常与具体形成对比,意味着没有直接可能存在某种类型的实例。

这就是为什么抽象方法不能将访问修饰符设为私有的原因。

答案 1 :(得分:11)

无法扩展final类,需要扩展abstract 以进行实例化。因此,final abstract类将是一个逻辑矛盾。

如果您的班级只有static种方法,也许您应该hide其构造函数,方法是将其定义为private .-

private StringUtils() {
}

答案 2 :(得分:1)

没有理由除了主观性,但你可以通过实现同样的目标  使你的班级抽象化并使你的所有方法成为最终的。像:

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

    public final static void myMethod2() {
        …
    }
}

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

答案 3 :(得分:0)

永远不会将方法标记为抽象和最终,或两者都标记 抽象和私人。想一想 - 必须实现抽象方法 (这实质上意味着被子类覆盖)而最终和私有 方法不能被子类覆盖。或者用另一种方式来表达,a 抽象指定意味着超类对如何知道任何事情 子类应该在该方法中表现,而最终的指定意味着 超类知道所有子类的所有内容(无论如何都是如此) 他们可能会继承树应该在该方法中表现。摘要和 最终的修饰语实际上是对立的。因为私人方法甚至不可能 由子类看到(更不用说继承了),它们也不能被覆盖,所以它们也是如此 不能标记为抽象。

答案 4 :(得分:0)

在Java中,无法创建抽象类的实例,我们只能具有抽象类类型的引用。因此,如果我们将抽象类定型为final,则将无法对其进行扩展。 抽象和最终是互斥的概念。 这就是为什么当您尝试在Java中将抽象类定为final时Java编译器会引发编译时错误的原因

答案 5 :(得分:0)

由于某些原因,我们不能最终将final与抽象类一起使用。 1.如果我们定义摘要final,则无法扩展它。 2.如果我们将抽象类定义为final,它将给出编译时错误。