Un metodo di interfaccia può avere un corpo?

So che un’interfaccia è come una pura class astratta al 100%. Quindi, non può avere implementazione del metodo in esso. Ma ho visto uno strano codice. Qualcuno può spiegarlo?

Snippet di codice:

interface Whoa { public static void doStuff() { System.out.println("This is not default implementation"); } } 

MODIFICARE:

Il mio IDE è Intellij Idea 13.1. Il progetto SDK è java 7 . L’IDE non mostra alcun errore del compilatore. Ma, quando compilo il codice dalla riga di comando, ricevo il seguente messaggio.

 Whoa.java:2: error: modifier static not allowed here public static void doStuff() { ^ 

Da Java 8 è ansible definire metodi statici nelle interfacce oltre ai metodi predefiniti.

  • Un metodo statico è un metodo associato alla class in cui è definito piuttosto che a qualsiasi object. Ogni istanza della class condivide i suoi metodi statici.

  • Ciò semplifica l’organizzazione dei metodi di supporto nelle tue librerie; puoi mantenere i metodi statici specifici per un’interfaccia nella stessa interfaccia piuttosto che in una class separata.

  • L’esempio seguente definisce un metodo statico che recupera un object ZoneId corrispondente a un identificatore del fuso orario; utilizza il fuso orario predefinito del sistema se non esiste un object ZoneId corrispondente all’identificatore specificato. (Di conseguenza, puoi semplificare il metodo getZonedDateTime )

Ecco il codice:

 public interface TimeClient { // ... static public 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 public ZonedDateTime getZonedDateTime(String zoneString) { return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); } } 

Guarda anche

  • Documenti Oracle per i metodi di interfaccia

  • Per tutte le cose interessanti in Java 8 leggi Tutto su Java 8

Questo è ansible solo in Java 8. Nella specifica di lingua Java 7 §9.4 , afferma esplicitamente:

È un errore in fase di compilazione se un metodo dichiarato in un’interfaccia viene dichiarato statico, perché i metodi statici non possono essere astratti.

Quindi, in Java 7, i metodi statici nelle interfacce non possono esistere.

Se vai alla Specifica della lingua Java 8 §9.4.3 , puoi vedere che dice:

Un metodo statico ha anche un corpo di blocco, che fornisce l’implementazione del metodo.

Quindi afferma esplicitamente che in Java 8 possono esistere.

Ho anche provato a eseguire il tuo codice esatto in Java 1.7.0_45, ma mi ha dato l’errore “modificatore statico non consentito qui”.


Ecco una citazione direttamente dal tutorial di Java 8 , Metodi predefiniti (Imparare il linguaggio Java> Interfacce ed Ereditarietà) :

Metodi statici

Oltre ai metodi predefiniti, è ansible definire metodi statici nelle interfacce. (Un metodo statico è un metodo associato alla class in cui è definito piuttosto che a qualsiasi object. Ogni istanza della class condivide i suoi metodi statici.) Ciò semplifica l’organizzazione dei metodi di supporto nelle librerie; puoi mantenere i metodi statici specifici per un’interfaccia nella stessa interfaccia piuttosto che in una class separata. L’esempio seguente definisce un metodo statico che recupera un object ZoneId corrispondente a un identificatore del fuso orario; utilizza il fuso orario predefinito del sistema se non esiste un object ZoneId corrispondente all’identificatore specificato. (Di conseguenza, puoi semplificare il metodo getZonedDateTime ):

 public interface TimeClient { // ... static public 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 public ZonedDateTime getZonedDateTime(String zoneString) { return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); } } 

Come i metodi statici nelle classi, si specifica che una definizione di metodo in un’interfaccia è un metodo statico con la parola chiave static all’inizio della firma del metodo. Tutte le dichiarazioni di metodo in un’interfaccia, inclusi i metodi statici, sono implicitamente public , quindi puoi omettere il modificatore public .

Per java versione 7 o successiva , è ansible ottenere risultati analoghi a livello funzionale utilizzando la class nidificata dichiarata nel corpo dell’interfaccia. e questa class annidata implementa l’interfaccia esterna.

Esempio:

 interface I1{ public void doSmth(); class DefaultRealizationClass implements I1{ @Override public void doSmth() { System.out.println("default realization"); } } } 

Come lo usiamo nel nostro codice?

 class MyClass implements I1{ @Override public void doSmth() { new I1.DefaultRealizationClass().doSmth(); } } 

Pertanto l’implementazione predefinita incapsulata all’interno dell’interfaccia.