假设我有一个只包含静态方法和变量的实用程序类。 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不支持这个?
答案 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,它将给出编译时错误。