2014-10-23 9 views
25

Perché l'interfaccia consente di avere il metodo main in Java 8?Perché l'interfaccia in Java-8 ha il permesso di avere il metodo principale?

Come indicato nel seguente codice, funziona correttamente e produce correttamente l'output.

public interface Temp { 
    public static void main(String args[]){ 
     System.out.println("Hello"); 
    } 
} 

USCITA (Dopo aver eseguito Temp.java)

Hello 

Allora, qual è la differenza tra metodo principale di interface e class?

Attualmente si sta comportando come una classe e ho hanno eseguito interface con metodo main.

Perché ne abbiamo bisogno?


EDIT

L'aggiunta di più alla domanda esistente, dal commento di seguito riportato (Di Brian Goetz)

avremmo dovuto esplicitamente annullato main metodi ora che static metodi sono ammissibile in interfaces (o, equivalentemente, escludono 'interface classes' come obiettivi per il programma di avvio Java.)


+7

Penso che tu abbia la domanda all'indietro. La domanda non è "dovrebbero essere consentiti i metodi principali", è "dovremmo avere esplicitamente disabilitato i metodi principali ora che i metodi statici sono permessi nelle interfacce" (o, equivalentemente, escludere le classi di interfaccia come target per il launcher java). Ciò avrebbe state aggiungendo * extra * regole solo per escludere qualcosa che alcune persone percepiscono come strano (ma non pericoloso) - e questo è un gioco perdente. Vuoi definire come poche nuove regole in base alle quali puoi ragionevolmente cavartela - perché altrimenti ti impantanare in complessità. –

+0

@BrianGoetz Sì, sono d'accordo !! Sto cercando la stessa cosa che ho espresso con l'output e la mia preoccupazione è, perché abbiamo un'interfaccia che si comporta effettivamente come una classe e Java è in grado di eseguire il metodo principale di _interface_.Alla fine l'interfaccia è in realtà una classe e java non possono distinguere tra il principale dell'interfaccia e la classe. –

+4

Le interfacce * sono * tipi di classe, e sono sempre state. Hanno alcuni valori predefiniti diversi (i metodi sono pubblici e astratti) e alcune restrizioni diverse. In Java 8 abbiamo rimosso alcune restrizioni, come la limitazione ai metodi statici. Non faremo una regola speciale per bandire un particolare metodo statico solo perché all'inizio sembra strano a poche persone. Quando comprendi veramente le nuove regole, questo non ti sembrerà strano, infatti la restrizione che proponi ti sembrerà strana. –

risposta

29

Dal Java 8, metodi statici sono ammessi nelle interfacce.

main() è un metodo statico.

Quindi, main() è consentito nelle interfacce.

Non abbiamo necessario, poiché non era consentito prima, eppure siamo sopravvissuti. Ma poiché i metodi statici, per definizione, non sono legati a un'istanza di una classe, ma alla classe stessa, ha senso consentirli nelle interfacce. Permette di definire i metodi di utilità relativi ad un'interfaccia (come quelli trovati in Collections, ad esempio), nell'interfaccia stessa, piuttosto che una classe separata).

Non vi è alcuna differenza tra i metodi statici di classe e i metodi statici di interfaccia.

+3

C'è almeno una piccola differenza tra i metodi statici su classi e interfacce: i metodi statici sulle classi possono essere "ereditati" dalle sottoclassi, ma i metodi statici sulle interfacce non sono ereditati da alcun sottotipo. –

+4

@StuartMarks, l'ereditarietà dei metodi statici è solo una magia del compilatore, poiché dichiarare lo stesso metodo con la stessa firma ombreggia il metodo statico nella super classe. Nel codice byte i metodi statici vengono richiamati tramite invocazione completamente qualificata sul metodo class +. – bestsss

+0

@bestsss: questo non è corretto. I metodi 'static' * sono * ereditati e il compilatore userà il tipo di destinazione formale trovato nel codice sorgente, da risolvere (di nuovo) in fase di runtime. L'invocazione contiene un riferimento a un metodo di classe +, ma questo vale anche per le invocazioni di metodi virtuali. Il punto chiave è che la dichiarazione di metodo effettiva non deve essere nella classe specificata, ma potrebbe essere invece in una superclasse. Vedi https://ideone.com/n9Caa2 (e questo è fondamentalmente diverso dai metodi 'static' nelle interfacce) ... – Holger

6

In Java 8 un'interfaccia può avere metodi statici. Dal momento che il metodo principale è anche un metodo statico, lo consentirà.

Possiamo dichiarare metodi di supporto comuni utilizzando questi metodi statici.

9

I seconda la risposta di @ jb-nizet.Non esiste un "bisogno disperato" per questo, ma rimuove una restrizione non necessaria. Per esempio. un esempio è, che ora è possibile dichiarare un metodo factory all'interno dell'interfaccia:

public interface SomeService { 

    public static SomeService getInstance() { 
    // e.g. resolve via service provider interface 
    } 

    ... 

} 

Prima di Java 8 abbiamo bisogno sempre di una classe di fabbrica separato. Un esempio preferito è l'API del motore di app di Google.

+3

Quindi un uso plausibile di un metodo principale su un'interfaccia sarebbe chiamare il factiry per ottenere un oggetto, quindi delegare a quell'oggetto per eseguire l'operazione del programma. – Raedwald

Problemi correlati