Java抽象接口

时间:2011-08-26 09:23:39

标签: java interface abstract

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

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

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


最后:如果abstract已过时,为什么它包含在Java中?是否有抽象界面的历史记录?

9 个答案:

答案 0 :(得分:439)

  

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

不是。

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

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

接口及其方法隐式abstract并添加修饰符没有区别。

  

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

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

  

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

有趣的问题。我挖出了第一个版本的JLS,甚至在那里它说"This modifier is obsolete and should not be used in new Java programs"

好的,进一步挖掘 ...在点击多个断开的链接后,我设法找到了原始Oak 0.2 Specification(或“手册”)的副本。我必须说非常有趣的阅读,总共只有38页! : - )

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

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

在边缘,它说

  

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

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


相关文章:Java: Abstract interfaces and abstract interface methods

答案 1 :(得分:36)

没有必要,它是可选的,就像接口方法上的public一样。

请参阅JLS:

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

  

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

  

9.4抽象方法声明

     

[...]

     

为了与旧版本的Java平台兼容,它是   作为一种风格问题,允许但不鼓励多余   为接口中声明的方法指定abstract修饰符。

     

这是允许的,但作为一种风格,强烈劝阻   冗余地为接口方法指定public修饰符。

答案 2 :(得分:11)

没有必要声明接口抽象。

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

但是没有人阻止你。

您可以明确声明的其他内容,但不需要:

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

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

接口已经是“抽象”的。再次应用该关键字绝对没有区别。

答案 3 :(得分:7)

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

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

答案 4 :(得分:3)

  

每个界面都是含蓄抽象的   此修饰符已过时,不应在新程序中使用。

[The Java Language Specification - 9.1.1.1 abstract Interfaces]

另请注意,接口成员方法隐式public abstract [The Java Language Specification - 9.2 Interface Members]

为什么隐含这些修饰符? 在这里没有其他修饰符(甚至不是'无修饰符' - 修饰符),所以你没有明确地输入它。

答案 5 :(得分:2)

没有必要。这是语言的一个怪癖。

答案 6 :(得分:2)

没有必要,因为接口默认是抽象的,因为接口中的所有方法都是抽象的。

答案 7 :(得分:-2)

至少在理论上,抽象接口并不像每个人所说的那样多余。

接口可以扩展,就像Class一样。如果您为应用程序设计了一个接口层次结构,那么您可能有一个“基础”接口,您可以扩展其他接口 不想作为对象本身。

示例:

public abstract interface MyBaseInterface {
    public String getName();
}

public interface MyBoat extends MyBaseInterface {
    public String getMastSize();
}

public interface MyDog extends MyBaseInterface {
    public long tinsOfFoodPerDay();
}

你不希望一个Class实现MyBaseInterface,只需要另外两个,MMyDog和MyBoat,但两个接口共享MyBaseInterface接口,所以有一个'name'属性。

我知道它有点学术,但我觉得有些人可能觉得有趣。 : - )

在这种情况下,它实际上只是一个“标记”,向接口的实现者发出信号 不是为了自己实现的。我应该指出一个编译器(至少是我试过的sun / ora 1.6)编译一个实现抽象接口的类。

答案 8 :(得分:-3)

井'抽象界面'是一个词汇结构:http://en.wikipedia.org/wiki/Lexical_analysis

编译器需要它,你也可以写interface

不要过多地使用语言的词法结构,因为他们可能已经将它放在那里解决一些编译歧义,这在编译过程中被称为特殊情况或者为了一些向后兼容性,试着关注核心词汇构造。

接口的本质是捕捉一些抽象概念(想法/思想/高阶思维等),其实现可能会有所不同......也就是说,可能存在多种实现。

接口是纯抽象数据类型,表示它正在捕获或表示的对象的功能。

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

如果你的具体类没有实现所有功能,它会再次变得抽象,因为你有一个想法或想法或抽象的实现,但它不完整,你可以通过abstract类来指定它。

具体类将是一个类/类集,它将完全捕获您尝试捕获类XYZ的抽象性。

所以模式是

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