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

PC.*_*PC. 5 c# java static abstract-class final

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Joe*_*yet 15

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

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

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

这与抽象方法无法将访问修饰符设为私有的原因相同.


ssa*_*tos 11

final类不能扩展,一个abstract需要被扩展在被实例化的顺序.因此,一个final abstract阶级将是一个逻辑矛盾.

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

private StringUtils() {
}
Run Code Online (Sandbox Code Playgroud)

  • `abstract`不需要*继承.实例化它是不可能的. (9认同)
  • 我知道这是面向对象语言的基本思想.但在我的例子中,没有矛盾.我不想扩展或实例化我的课程. (8认同)
  • 请详细说明为什么一个类既不是可实例化的(它是抽象的)也不是可扩展的(它是最终的)是一个矛盾.Java不允许一个人在类上用关键字声明它们并不是这样的!通过使用私有构造函数和规则来解决这个问题仍然不常见. (3认同)
  • 对我来说,当你添加一些抽象方法时,抽象类是有意义的.如果您不希望实例化您的类,则应考虑将其默认构造函数定义为private. (2认同)