我尝试编译以下测试接口:
public interface TestInterface {
void m();
abstract void am();
default void dm() { }
static void sm() { }
public void pm();
public abstract void pam();
public default void pdm() { }
public static void psm() { }
}
使用我碰巧在身边的 JDK,即:8、8u5、8u11、8u25、8u40,以及几天前的 jdk9-dev 版本。它在所有这些版本上都成功编译。
正如其他人所指出的,接口中的方法都是公共的,无论是否public
指定。此外,方法可以是抽象的、默认的或静态的,如果没有指定这些方法,则方法是抽象的。( JLS 9.4 ) 最后,声明的方法default
必须static
有一个块{ ... }
作为主体,而抽象方法(无论是否声明)必须有一个分号;
作为主体。( JLS 9.4.3 )
如果该方法是公开的,我也需要将其明确提及为静态的……但是为什么默认情况下不强制执行?(来自评论)关键字 static 如果它是公共的,则需要在那里。
我没有看到这个。所有接口方法都是公共的,无论它们是否明确声明。这与静态或默认方法正交。
事实上,用默认值指定静态会产生错误。
是的,方法可以是静态的或默认的,但不能同时是两者。
我收到错误“接口抽象方法不能有正文”
如果您收到此错误,则必须将块指定{ ... }
为抽象方法的主体,无论该方法是否显式声明为抽象。
(JDK 9 最近在接口中增加了对私有方法的支持。)