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

Posted

技术标签:

【中文标题】为啥要将 Java 接口方法声明为抽象的?【英文标题】:Why would one declare a Java interface method as abstract?为什么要将 Java 接口方法声明为抽象的? 【发布时间】:2010-10-13 02:17:21 【问题描述】:

我今天使用 Eclipse 的“拉接口”重构特性来创建基于现有类的接口。对话框提供了将新接口的所有新方法创建为“抽象”方法。

这样做有什么好处?

我认为允许您将接口方法声明为抽象的事实是该语言的一个多余且无害的特性,并不特别鼓励。

为什么 Eclipse 会支持这种风格,或者为什么有人会自愿选择这样做?

澄清:我不是在问为什么接口方法是抽象的,这是显而易见的。我在问为什么要明确选择将它们标记为抽象,因为如果它们在接口中,它们无论如何都是抽象的。

【问题讨论】:

【参考方案1】:

根据JLS,接口中的方法默认是抽象的,所以关键字是多余的。知道这一点,我永远不会用它来“避免展示混乱”。

【讨论】:

这应该是正确的答案。这是更新的link - 请参阅“注释”部分 JLS 没有说关键字对于接口中的方法已过时。它说“允许,但从风格上不鼓励,为接口中声明的方法冗余地指定公共和/或抽象修饰符。” JLS #9.4. @EJP 我并没有说 JLS 声明该关键字会过时,这是我个人的观点;)顺便说一句,他们注意到这个关键字是“冗余的”,这与过时并不完全相同,在这你当然是对的。现在我知道我将编辑答案以澄清这一点。【参考方案2】:

根据Java Language Specification,接口的abstract 关键字已过时,不应再使用。 (第 9.1.1.1 节)

也就是说,鉴于 Java 倾向于向后兼容,我真的怀疑是否存在 abstract 关键字是否会有所作为。

【讨论】:

这是我的理解(虽然我不熟悉具体的 JLS 部分)。我想知道为什么 Eclipse 会为我提供创建过时标记的选项... 知道了。某个地方的某个人必须确定这是一个理想的“功能”并将其放入。你知道,其中一种狡猾的开源类型:) 虽然这是评价最高的答案,但它指的是规范的错误部分; 9.1.1.1 在接口本身的声明上描述了abstract 关键字,而不是在其成员上。 @Will 下面的答案是正确的,并且还包含有效的链接来源。【参考方案3】:

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

对于Java SE 5.0:“为了与旧版本的 Java 平台兼容,作为一种风格,允许但不鼓励为接口中声明的方法冗余指定抽象修饰符。”

【讨论】:

【参考方案4】:

“这样做的好处”(在接口方法声明上添加抽象)将是与 jdt eclipse compiler in jdk1.3 的旧兼容性问题

从 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 中不需要存在“抽象”项目。

【讨论】:

很好的发现。因此,它的功能是解决 Eclipse 编译器中不再存在的问题。 @jdmichal:没错,也是对Uri问题的更准确的回答。

以上是关于为啥要将 Java 接口方法声明为抽象的?的主要内容,如果未能解决你的问题,请参考以下文章

Java面向对象之抽象类,接口

为啥要将 grails 操作声明为方法而不是闭包,它有啥区别?

Java自学-接口与继承 抽象类

《Java核心技术 卷1 基础知识》三

java接口和抽象类

转:Java接口和抽象类