2014-04-18 50 views
5

據我所知,你不能在界面體中聲明靜態方法。但是,無意中我在http://docs.oracle.com/網站上發現了一段特殊的代碼。這裏是linkjava界面中的靜態方法

Namelly

public interface TimeClient 
{ 
void setTime(int hour, int minute, int second); 
void setDate(int day, int month, int year); 
void setDateAndTime(int day, int month, int year, 
          int hour, int minute, int second); 
LocalDateTime getLocalDateTime(); 

static ZoneId getZoneId (String zoneString) { 
    try { 
     return ZoneId.of(zoneString); 
    } catch (DateTimeException e) { 
     System.err.println("Invalid time zone: " + zoneString + 
      "; using default time zone instead."); 
     return ZoneId.systemDefault(); 
    } 
} 

default ZonedDateTime getZonedDateTime(String zoneString) { 
    return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); 
    } 
} 

interface有一個static方法getZoneId

我輸了...任何人都可以解釋請

+4

您_can_聲明在接口的靜態方法開始與Java 8還請注意'getZoneDateTime(不與Java 8的Function它基本上是從番石榴偷走了,與Predicate沿和其他一些混合) ()'方法(虛擬擴展方法,在Java 8中也是新的)。 – fge

+1

請參閱http://marioosh.5dots.pl/2014/02/12/java-8-default-and-static-methods-in-interfaces.html – Sap

+0

您沒有看到Java 8的新功能列表嗎?覈實。 –

回答

5

的Java 8現在有「默認的想法「接口中的方法實現:

http://blog.hartveld.com/2013/03/jdk-8-13-interface-default-method.html

+1

大家都回答了我的問題。儘管你是第一個。 –

+1

不是真的,默認和靜態方法有區別,所以我們不要混淆這些(和其他用戶)。這可能是一個很好的指針,但不是一個正確的答案。 – virgo47

+0

@ virgo47你是對的,我不知道我在這裏做什麼。我期待看看問題是否最初引用了默認方法,但沒有。我會刪除這個。呃,不能刪除它,因爲它被接受:( –

5

從Java 8開始,您可以執行此操作。您的片段來自的official tutorial(已更新爲Java 8)說得好:

接口體可以包含抽象方法,默認的方法,和靜態方法。接口中的抽象方法後面是分號,但沒有大括號(抽象方法不包含實現)。默認方法使用default修飾符和使用static關鍵字的靜態方法來定義。接口中的所有抽象,默認和靜態方法都是隱式公開的,因此您可以省略public修飾符。

或者從Java 8的JLS section 9.4

默認的方法是與default修改的接口中聲明的方法;它的身體總是由一個塊代表。它爲任何實現接口而不重寫方法的類提供了默認實現。缺省方法不同於在類中聲明的具體方法。

...

一個接口可以聲明靜態方法,其在不參考調用一個特定對象。

4

在Java 8中,接口可以具有靜態方法,以及具有默認實現的可覆寫方法。他們仍然不能有實例字段。這些功能是lambda表達式支持的一部分,您可以在H部分閱讀更多關於它們的內容。 JSR 335

13

你是在Java中8這裏有兩個新的特點見證:

  • 靜態方法在接口方面,
  • 虛擬擴展方法。

在您提供的代碼示例中,getZoneId()說明了第一個新穎性,而.getZoneDateTime()第二個。

第二個特別是什麼已經允許Collection接口來與補充方法如.stream(),例如,而不破壞向後兼容性進行擴展。有關說明,請參閱here

第一個允許避免編寫「方法包」類,它們通常只存在於接口上提供實用靜態方法。其中一個例子是Guava's Functions class