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)); } }
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 objectZoneId
corrispondente all’identificatore specificato. (Di conseguenza, puoi semplificare il metodogetZonedDateTime
):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 implicitamentepublic
, quindi puoi omettere il modificatorepublic
.
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.
interface I1{ public void doSmth(); class DefaultRealizationClass implements I1{ @Override public void doSmth() { System.out.println("default realization"); } } }
class MyClass implements I1{ @Override public void doSmth() { new I1.DefaultRealizationClass().doSmth(); } }
Pertanto l’implementazione predefinita incapsulata all’interno dell’interfaccia.