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

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

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


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


当前回答

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

其他回答

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

注意,在春季,它没有学术意义。 抽象接口是对开发人员的警告,不要将其用于@Autowired。 我希望spring/eclipse @Autowired能够查看这个属性,并警告/fail使用该属性。

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

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

它不是。

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:抽象接口和抽象接口方法

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

接口可以被扩展,就像类一样。如果你为你的应用程序设计一个接口层次结构,你可能有一个“基础”接口,你从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)编译一个实现抽象接口的类。

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

请看下面的JLS:

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

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

And

9.4抽象方法声明 […] 为了与旧版本的Java平台兼容,它是 作为一种风格,允许但不鼓励冗余 为接口中声明的方法指定抽象修饰符。 这是允许的,但作为一种风格问题,强烈不鼓励 冗余地为接口方法指定公共修饰符。