考虑一个例子(用java编译)

public abstract interface Interface {
    public void interfacing();
    public abstract boolean interfacing(boolean really);
}

为什么接口必须被“声明”为抽象?是否有其他规则适用于抽象接口?


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


当前回答

为什么接口必须被“声明”为抽象?

它不是。

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

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

接口及其方法是隐式抽象的,添加这个修饰符没有任何区别。

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

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

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

有趣的问题。我翻出了第一版的JLS,即使在那里它也说“这个修饰符已经过时了,不应该在新的Java程序中使用”。

好吧,再深入挖掘一下……在点击了许多失效的链接之后,我设法找到了一份原始的Oak 0.2规范(或“手册”)。我必须说,这本书很有趣,总共只有38页!: -)

在第5节“接口”中,提供了以下示例:

public interface Storing {
    void freezeDry(Stream s) = 0;
    void reconstitute(Stream s) = 0;
}

在空白处写着

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

假设=0被abstract关键字替换,我怀疑abstract在某些时候对于接口方法是强制性的!


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

其他回答

不需要声明接口抽象。

就像声明所有这些方法是公共的(如果接口是公共的,它们已经是公共的)或抽象的(它们已经在接口中是公共的)是多余的。

不过,没人会阻止你。

其他你可以明确声明的事情,但不需要:

在构造函数的第一行调用super() 扩展对象 实现继承接口

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

接口已经是“抽象的”了。再次应用这个关键字完全没有区别。

为什么接口必须被“声明”为抽象?

它不是。

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

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

接口及其方法是隐式抽象的,添加这个修饰符没有任何区别。

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

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

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

有趣的问题。我翻出了第一版的JLS,即使在那里它也说“这个修饰符已经过时了,不应该在新的Java程序中使用”。

好吧,再深入挖掘一下……在点击了许多失效的链接之后,我设法找到了一份原始的Oak 0.2规范(或“手册”)。我必须说,这本书很有趣,总共只有38页!: -)

在第5节“接口”中,提供了以下示例:

public interface Storing {
    void freezeDry(Stream s) = 0;
    void reconstitute(Stream s) = 0;
}

在空白处写着

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

假设=0被abstract关键字替换,我怀疑abstract在某些时候对于接口方法是强制性的!


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

“抽象接口”是一个词汇结构:http://en.wikipedia.org/wiki/Lexical_analysis。

它是编译器要求的,你也可以写接口。

好吧,不要过多地讨论语言的词汇结构,因为他们可能把它放在那里是为了解决编译过程中被称为特殊情况的编译歧义,或者为了一些向后兼容性,尽量关注核心词汇结构。

“界面的本质是捕捉一些抽象概念(想法/思想/更高层次的思维等),这些概念的实现可能会有所不同……也就是说,可能有多个实现。

接口是一种纯抽象的数据类型,表示它所捕获或表示的对象的特征。

特征可以用空间或时间来表示。当它们用空间(内存存储)表示时,这意味着你的具体类将实现一个字段和方法/方法,这些方法将对该字段进行操作,或者用时间表示,这意味着实现功能的任务纯粹是计算性的(需要更多的cpu时钟来处理),所以你在功能实现的空间和时间之间进行了权衡。

如果你的具体类没有实现所有的特性,它又会变成抽象的,因为你有你的思想或想法或抽象性的实现,但它不是完整的,你通过抽象类来指定它。

具体类将是一个类或一组类,它将完全捕获您试图捕获的抽象性XYZ类。

所以模式是

Interface--->Abstract class/Abstract classes(depends)-->Concrete class

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

Java语言规范- 9.1.1.1抽象接口

还要注意,接口成员方法是隐式的公共抽象方法。 [Java语言规范- 9.2接口成员]

为什么这些修饰语是隐式的? 这里没有其他有用的修饰符(甚至没有'no modifier'-modifier),所以你不必显式地输入它。

这是不必要的。这是语言的怪癖。