Java抽象接口

Buh*_*ndi 194 java interface abstract

考虑一个例子(在java中编译)

public abstract interface Interface {
    public void interfacing();
    public abstract boolean interfacing(boolean really);
}
Run Code Online (Sandbox Code Playgroud)

为什么接口被"声明"抽象是必要的?是否有适用于抽象接口的其他规则?


最后:如果abstract已经过时,为什么它包含在Java中?抽象界面有历史吗?

aio*_*obe 440

为什么接口被"声明"抽象是必要的?

不是.

public abstract interface Interface {
       \___.__/
           |
           '----> Neither this...

    public void interfacing();
    public abstract boolean interfacing(boolean really);
           \___.__/
               |
               '----> nor this, are necessary.
}
Run Code Online (Sandbox Code Playgroud)

接口及其方法是隐式的,abstract并且添加修饰符没有区别.

是否有适用于抽象接口的其他规则?

不,同样的规则适用.该方法必须由任何(具体)实现类实现.

如果抽象已经过时,为什么它包含在Java中?抽象界面有历史吗?

有趣的问题.我挖出了第一 JLS的版本,甚至还有它说:"这个修改是过时的,不应该在新的Java程序中使用".

好的,进一步挖掘 ......在击中无数断链后,我设法找到了原始的Oak 0.2 规范(或"手册")的副本.我必须说非常有趣的阅读,总共只有38页!:-)

在第5节"接口"下,它提供了以下示例:

public interface Storing {
    void freezeDry(Stream s) = 0;
    void reconstitute(Stream s) = 0;
}
Run Code Online (Sandbox Code Playgroud)

它在边缘说

将来,在接口中声明方法的"= 0"部分可能会消失.

假设=0abstract关键字取代,我怀疑abstract在某些时候接口方法是强制性的!


相关文章:Java:抽象接口和抽象接口方法

  • 顺便说一句.接口声明中的方法也不需要"public"......它们总是公开的. (16认同)
  • 哇.所以它是"按设计"过时的.那些JLS设计师真的总是那么害怕破坏某些东西,甚至破坏那些从未发布过的东西...... :-) (13认同)
  • 但摘要本身并不过时,或者?它对于接口已经过时,但仍然有抽象的类和方法. (3认同)

Luk*_*der 37

它不是必需的,它是可选的,就像public接口方法一样.

请参阅JLS:

http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html

9.1.1.1抽象接口每个接口都是隐式抽象的.此修饰符已过时,不应在新程序中使用.

9.4抽象方法声明

[...]

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

作为一种风格问题,允许冗余地指定接口方法的公共修饰符.

  • 对于JLS:作为一种风格问题,允许但强烈劝阻冗余地写出两个具有相同含义和几乎完全相同的措辞的句子...... (7认同)

Thi*_*ilo 11

没有必要声明接口抽象.

就像声明所有那些方法public(它们已经是接口是公共的)或抽象(它们已经在接口中)是多余的.

但是没有人阻止你.

您可以明确说明的其他事项,但不需要:

  • 在构造函数的第一行调用super()
  • extends Object
  • 实现继承的接口

是否有适用于抽象接口的其他规则?

界面已经是"抽象的".再次应用该关键字绝对没有区别.

  • 显然,如果接口本身是包私有的,那么这些方法甚至是公共的. (2认同)

小智 7

请注意,在Spring中它具有非学术意义.抽象接口是对开发人员不使用它的警告@Autowired.我希望spring/eclipse @Autowired会查看这个属性并警告/失败这些用法.

一个真实的例子:@Transnational下的@Service代理需要使用相同的基本方法,但是它们应该使用扩展这个抽象接口的不同接口@Autowired.(我称之为XXXSpec界面)