2009-09-29 21 views
5

Ho il seguente interfaccia in JavaIn Java, quando dovrei usare un metodo astratto in un'interfaccia?

public interface IFoo 
{ 
    public abstract void foo(); 
    public void bar(); 
} 

Qual è la differenza tra foo() e bar()? Quando dovrei usare astratto?

Entrambi sembrano realizzare ciò che voglio a meno che mi manchi qualcosa di sottile?

Aggiornamento duplicati di Why would one declare a Java interface method as abstract?

+0

Compilare davvero? –

+1

Compila; solo che il modificatore astratto è ridondante. – Anoop

+3

Sembra un duplicato di questa domanda - http://stackoverflow.com/questions/641536/why-would-one-declare-a-java-interface-method-as-abstract –

risposta

18

Non c'è alcuna differenza funzionale. Nessuna implementazione viene mai fornita in un'interfaccia java, quindi tutte le dichiarazioni dei metodi sono implicitamente astratte.

Sede [1]: http://java.sun.com/docs/books/tutorial/java/IandI/abstract.html

una citazione diretta forma di cui sopra:

Nota: Tutti i metodi di un'interfaccia (vedere la sezione Interfaces) sono implicitamente astratta, quindi il modificatore abstract non è usato con i metodi di interfaccia (potrebbe essere-non è solo necessario).

2

abstract in questo scenario non è necessaria (come sta contrassegnando i metodi nelle interfacce come public).

Si dovrebbe invece utilizzare questo metodo su una classe astratta per imporre l'override di una sottoclasse.

3

Entrambi eseguono lo stesso, poiché tutti i metodi in un'interfaccia sono astratti.

2

Non ci sono differenze tra le dichiarazioni. Concettualmente, tutti i metodi in un'interfaccia sono astratti.

17

I metodi di interfaccia sono entrambi public e abstract per impostazione predefinita. Non c'è differenza tra foo() e bar() e puoi tranquillamente rimuovere tutte le parole chiave public e abstract.

+4

Non direi "di default" ma piuttosto "implicitamente". "Di default" potrebbe essere interpretato come esistono altre opzioni oltre a "pubblico astratto". –

5

Non manca nulla. Dalla Java Language Specification:

Ogni dichiarazione di metodo nel corpo di un'interfaccia è implicitamente astratto, per cui il suo corpo è sempre rappresentato da una virgola, non un blocco .

Ogni dichiarazione di metodo nel corpo di un'interfaccia è implicitamente pubblica.

In altre parole, è possibile omettere la public così come la abstract sui metodi di interfaccia.

4

E 'ridondante (non c'è alcuna differenza tra le due dichiarazioni) ed esplicitamente scoraggiato nel section 9.4 della specifica Java Language:

Per la compatibilità con le versioni precedenti della piattaforma Java, è consentito ma scoraggiato, come questione di stile, per specificare in modo ridondante il modificatore astratto per i metodi dichiarati nelle interfacce .

E public è altrettanto inutile e scoraggiato:

E 'consentito, ma fortemente sconsigliato per una questione di stile, per specificare in modo ridondante il modificatore pubblico per i metodi di interfaccia.

non so il motivo per cui è publicfortemente scoraggiato ma abstract è solo scoraggiato ...

+1

Solo speculazioni ... ma per la parola chiave astratta - è ridondante e abbastanza ovvio - non c'è implementazione lì. È facile riconoscere se conosci il concetto generale di interfacce. Se il modificatore pubblico è stato specificato, potrebbe portare qualcuno che non conosce il pubblico è l'opzione predefinita (e unica) di pensare di poter cambiare il modificatore di accesso in qualcos'altro. – Nate

0

Sia foo() e bar() sono astratti come vengono dichiarate all'interno di un'interfaccia. La parola astratta che hai usato qui non ha alcun significato - è meglio rimuoverla.

0

Le interfacce in java sono uguali "in qualche modo" a classi completamente astratte, quindi aggiungere la parola chiave "abstract" a una dichiarazione di metodo in un'interfaccia non ha nulla a che fare con il metodo!

Problemi correlati