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

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

那有什么好处?

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

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

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

53520 次浏览

根据 Java 语言规范,用于接口的 abstract关键字已经过时,不应该再使用

也就是说,鉴于 Java 的向后兼容性,我真的怀疑它是否会对 abstract关键字的存在产生影响。

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

Eclipse 中的“好处”(在接口方法声明中添加摘要)将是与 Jdk1.3中的 jdt eclipse 编译器的一个旧兼容性问题

自1.4以来,jdk 库不再包含默认的抽象方法(在实现接口的抽象类上)。
这是在愚弄 Eclipse 1.3编译器的诊断,因为它们的实现依赖于它们的存在。
请注意,Java1.3将拒绝对1.4库执行任何操作(使用-bootclassspath 选项)。

由于 Eclipse 编译器可能处于1.4遵从性级别(请参阅 Workbench>Preferences>Java>Compiler>JDK Compliance) ,或者如果使用1.3遵从性模式,则至少使用1.3类库,因此在大多数当前 Eclipse 项目中不需要“抽象”。

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

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