考虑一个例子(用java编译)
public abstract interface Interface {
public void interfacing();
public abstract boolean interfacing(boolean really);
}
为什么接口必须被“声明”为抽象?是否有其他规则适用于抽象接口?
最后:如果抽象已经过时,为什么Java中还包含它?抽象界面有历史吗?
考虑一个例子(用java编译)
public abstract interface Interface {
public void interfacing();
public abstract boolean interfacing(boolean really);
}
为什么接口必须被“声明”为抽象?是否有其他规则适用于抽象接口?
最后:如果抽象已经过时,为什么Java中还包含它?抽象界面有历史吗?
当前回答
这是不必要的,因为接口默认是抽象的,因为接口中的所有方法都是抽象的。
其他回答
“抽象接口”是一个词汇结构:http://en.wikipedia.org/wiki/Lexical_analysis。
它是编译器要求的,你也可以写接口。
好吧,不要过多地讨论语言的词汇结构,因为他们可能把它放在那里是为了解决编译过程中被称为特殊情况的编译歧义,或者为了一些向后兼容性,尽量关注核心词汇结构。
“界面的本质是捕捉一些抽象概念(想法/思想/更高层次的思维等),这些概念的实现可能会有所不同……也就是说,可能有多个实现。
接口是一种纯抽象的数据类型,表示它所捕获或表示的对象的特征。
特征可以用空间或时间来表示。当它们用空间(内存存储)表示时,这意味着你的具体类将实现一个字段和方法/方法,这些方法将对该字段进行操作,或者用时间表示,这意味着实现功能的任务纯粹是计算性的(需要更多的cpu时钟来处理),所以你在功能实现的空间和时间之间进行了权衡。
如果你的具体类没有实现所有的特性,它又会变成抽象的,因为你有你的思想或想法或抽象性的实现,但它不是完整的,你通过抽象类来指定它。
具体类将是一个类或一组类,它将完全捕获您试图捕获的抽象性XYZ类。
所以模式是
Interface--->Abstract class/Abstract classes(depends)-->Concrete class
抽象的接口并不像每个人说的那样多余,至少在理论上是这样。
接口可以被扩展,就像类一样。如果你为你的应用程序设计一个接口层次结构,你可能有一个“基础”接口,你从but扩展其他接口 不想要作为一个对象本身。
例子:
public abstract interface MyBaseInterface {
public String getName();
}
public interface MyBoat extends MyBaseInterface {
public String getMastSize();
}
public interface MyDog extends MyBaseInterface {
public long tinsOfFoodPerDay();
}
你不需要一个类来实现MyBaseInterface,只需要另外两个,MMyDog和MyBoat,但两个接口共享MyBaseInterface接口,所以有一个'name'属性。
我知道这有点学术,但我想有些人可能会觉得很有趣。: -)
在这种情况下,它实际上只是一个“标记”,向接口的实现者发出信号 并不是为独立实现而设计的。我应该指出一个编译器(至少我尝试了sun/ora 1.6)编译一个实现抽象接口的类。
注意,在春季,它没有学术意义。 抽象接口是对开发人员的警告,不要将其用于@Autowired。 我希望spring/eclipse @Autowired能够查看这个属性,并警告/fail使用该属性。
一个真实的例子:@Transnational到@Repository下的@Service代理需要使用相同的基本方法,但是由于@Autowired,它们应该使用不同的接口来扩展这个抽象接口。 (我称之为XXXSpec接口)
这是不必要的。这是语言的怪癖。
这是不必要的,因为接口默认是抽象的,因为接口中的所有方法都是抽象的。