我嘗試編譯下面的測試接口過早下結論之前嘗試了這一點:
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)
如果該方法是公開的我需要明確提到它也是靜態的...但爲什麼這不是默認強制執行? (從comment)關鍵字靜態需要在那裏,如果它是公開的。
我沒有看到這個。所有接口方法都是公共的,無論它們是否被明確聲明。這與方法是靜態的或默認的正交。
事實上,指定靜態默認值會給出錯誤。
是的,一種方法可以是靜態或默認的,但不能同時使用兩種。
我得到一個錯誤「的界面抽象方法不能有身體」
如果您收到此錯誤,您必須指定塊{ ... }
作爲身體的一個抽象方法,無論或者不將該方法顯式聲明爲抽象。
(JDK 9最近增加了對接口的私有方法的支持。)
如果該方法是公開的,我需要明確提及它static_你確定嗎? – 2015-04-01 19:07:48
是的,我得到一個錯誤「接口抽象方法不能有正文」 – Rnet 2015-04-01 19:09:44
你不是用Java 8編譯。「默認」方法不能是「靜態」。 「默認」方法隱含地是「公共」的。 – 2015-04-01 19:10:56