为什么要将接口声明为抽象?

什么是声明一个接口为抽象的点? 接口方法也一样。 有没有指向它?

例如。

public abstract interface Presenter { public abstract void go(final HasWidgets container); } 

你在哪里遇到你发布的代码块,任何旧的Java代码库?
这就是JLS所说的:

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

9.4抽象方法声明:
为了与Java平台的旧版本兼容,作为样式,允许但不鼓励冗余地指定在接口中声明的方法的抽象修饰符。

即使没有声明,接口和接口方法也是隐式abstract 。 所以没有必要明确指定它。

没有任何区别 – 接口和接口方法总是抽象的,但你不必添加修饰符(和接口方法总是公开的,所以你也不需要public修饰符)。

从JLS :

9.1.1.1抽象接口

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

通常,您不要将接口或其方法声明为抽象。 它们是隐含的。

方法也是公开的,所以你也可以跳过。 🙂

看看这个post

https://stackoverflow.com/questions/4380796/what-is-public-abstract-interface-in-java/4381308#4381308

界面是%100抽象类。

关键字摘要在这里是多余的

接口的默认行为基本上与您在示例中的行为相同。 将其定义为抽象仅仅是多余的。

我认为只是冗长,明确和一致的类语法和语义…

你不必这样做,但是如果你的代码的某些读者分心或者不熟悉Java,也许会有所帮助。

声明接口是抽象的没有意义。 因为接口中的方法只是抽象的。另外一个抽象类可以同时具有具体和抽象的方法,但是在接口中应该只有抽象的方法。

一个接口方法的抽象修饰符总是冗余的,以及public修饰符。

由于严格的技术原因,接口上的抽象修饰符本身可能是多余的,因为接口永远不能使用new运算符实例化,并且如果通过reflection来询问接口,它总是抽象的。

然而,声明一个接口抽象(也被各种UML工具支持)可能有一个语义原因:你可能想expression一个接口被显式声明为抽象的,非抽象类可能不实现接口直接但只能通过子接口。 因此,例如,可以将接口节点视为语义抽象,而扩展节点的子接口文件夹和文件在语义上不是抽象的。 你永远不会有一个只有一个节点的实例 – 它将是一个文件夹或文件。

甚至还有框架允许“实例化”接口(技术上通过dynamic代理)。 有一些接口(例如一个预定义的基本接口)不允许作为参数提供。 出于文档的目的,在源代码中使用抽象修饰符来expression这样的信息是有意义的。