考虑一个例子(在java中编译)
public abstract interface Interface {
public void interfacing();
public abstract boolean interfacing(boolean really);
}
为什么接口被“声明”抽象是必要的?是否有适用于抽象接口的其他规则?
最后:如果abstract
已过时,为什么它包含在Java中?是否有抽象界面的历史记录?
答案 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”部分可能会消失。
假设=0
被abstract
关键字取代,我怀疑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)
没有必要声明接口抽象。
就像声明所有那些公共方法(如果接口是公共的那样)或者抽象(它们已经在接口中)是多余的。
但是没有人阻止你。
您可以明确声明的其他内容,但不需要:
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