为什么要将Java接口方法声明为抽象的?

146
我今天在Eclipse中使用了“拉取接口”重构功能,在现有类的基础上创建了一个接口。对话框提供了将新接口的所有新方法创建为“抽象”方法的选项。
这样做有什么好处呢?
我认为,允许声明接口方法为抽象方法是一种多余且无害的语言特性,不特别鼓励使用。
为什么Eclipse支持这样的风格,或者为什么有人自愿选择这样做呢?
澄清一下:我不是在问为什么接口方法是抽象的,这是显而易见的。我想知道的是,既然它们已经在接口中,为什么会有人明确选择标记它们为抽象的。
4个回答

150
根据Java语言规范,接口中的abstract关键字已经过时,不应再使用。(第9.1.1.1节)
尽管如此,由于Java倾向于向后兼容,我真的怀疑abstract关键字是否存在都无关紧要。

1
那是我的理解(尽管我不熟悉具体的JLS部分)。我想知道为什么Eclipse会给我提供创建过时标记的选项... - Uri
明白了。肯定是有人觉得这是个不错的“特性”然后加进去了。你知道,那些狡猾的开源类型 :) - jdmichal
18
虽然这是最佳答案,但它指的是规范书中错误的部分;9.1.1.1描述的是在接口本身的声明中使用abstract关键字,而不是在它的成员中使用。@Will下面的回答是正确的,并且包含有效的链接来源。 - Shaggy Frog

40
在Eclipse中,在接口方法声明上添加抽象内容(adding abstract on interface methods declaration),这样做的好处是解决与JDK1.3中的JDT Eclipse编译器存在的兼容性问题(通过此链接可查看相关Bug:https://bugs.eclipse.org/bugs/show_bug.cgi?id=11435)。
自从JDK 1.4版本之后,JDK库不再默认包含抽象类实现接口时的默认抽象方法。这会影响到Eclipse 1.3编译器的诊断,因为它们的实现依赖于这些默认方法的存在。需要注意的是,使用Javac 1.3编译器无法对1.4库执行操作(需使用-bootclasspath选项)。
由于Eclipse编译器可能符合1.4级别的兼容性标准(请参见Workbench>Preferences>Java>Compiler>JDK Compliance)或者至少使用1.3类库(如果使用1.3兼容模式),因此在当前大多数Eclipse项目中不需要使用“抽象”关键字。

3
不错的发现。所以它的功能是解决Eclipse编译器中已不存在的问题。 - jdmichal
1
@jdmichal:没错,而且这也是 Uri 问题的更准确的答案。 - VonC

40

来自Java SE 7 JLS(Java语言规范):“在接口中声明方法时,允许但不鼓励冗余指定public和/或abstract修饰符。”

Java SE 5.0: “为了与旧版本的Java平台兼容,允许但不鼓励在接口中声明方法时冗余指定abstract修饰符,这是一种风格上的问题。”


9

根据 JLS,接口中的方法默认为抽象的,因此关键字是多余的。了解这一点后,我不会使用它来“避免呈现上的混乱”。


这应该是正确的答案。这里有一个更新的链接(http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html)-请参阅“注意”部分。 - mork
JLS并未表示接口方法中的关键字已经过时。它说:“在接口中声明方法时,可以但不建议冗余地指定public和/或abstract修饰符,这是一种风格问题。” [JLS#9.4](http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.4)。 - user207421
@EJP,我并没有说JLS声明该关键字将过时,这只是我的个人观点;顺便说一下,他们指出这个关键字是“冗余的”,这与过时并不完全相同,你当然是正确的。现在我知道了,我会编辑答案以澄清这一点。 - Daniel Hiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接