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

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

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

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

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

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

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

 private StringUtils() { } 

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

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

除此之外,没有固有的理由说明抽象的最终类是不合逻辑的 – 抽象这个词通常与具体forms相反,意味着不存在类型的直接实例。

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

你不能inheritancefinal class ,但是abstract class可以inheritance到子类。

永远不会将方法标记为抽象和最终,或者抽象和私有。 想一想 – 必须实现抽象方法(本质上意味着被子类覆盖),而子类不能覆盖final和private方法。 或者用另一种方式来表达,抽象指定意味着超类不知道子类在该方法中应该如何表现,而最终指定意味着超类知道所有子类如何(尽管它们可能在inheritance树的下方) be)应该在那种方法中表现出来。 抽象和最终修饰符实际上是对立的。 因为私有方法甚至不能被子类看到(更不用说inheritance了),所以它们也不能被覆盖,所以它们也不能被标记为抽象。

你能做的就是让你的课抽象化,让你所有的方法都成为最终的。 喜欢:

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

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