2011-11-18 16 views
5

Sono molto confuso riguardo l'iteratore in Java.Dichiarazione di un iteratore in Java

Il tutorial è stato lettura detto questo:

Nel linguaggio di programmazione Java, un'interfaccia è un tipo di riferimento, simile a una classe, che può contenere solo le costanti, le firme dei metodi e tipi nidificati. Non ci sono corpi di metodo. Le interfacce non possono essere istanziate, possono solo essere implementate da classi o estese da altre interfacce. L'estensione è discussa più avanti in questa lezione.

Poi vidi un altro tutorial con questo:

Iterator<String> flavoursIter = aFlavours.iterator(); 

Capisco che aFlavours ha inheritated le funzioni iteratore che restituisce l'interfaccia iteratore. Non capisco cosa stia realmente succedendo in questa linea. Pensavo non si potesse istanziare?

Forse non ho senso, ma per favore dimmi che sto andando fuori pista.

+2

Restituisce solo un'implementazione concreta di tale interfaccia. Vedi anche http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html – BalusC

risposta

7

Dicendo che non può essere istanziato, ciò che intendono è che non è possibile fare Iterator i = new Iterator();. Poiché Iterator è un'interfaccia, non ha implementazione da solo. Quando si esegue

Iterator flavoursIter = aFlavours.iterator(); 

quello che stai facendo sta chiamando un metodo chiamato "iteratore" sull'oggetto aFlavours che restituisce un'istanza di una classe che implementa l'interfaccia Iterator (non si sa davvero quale classe si precisa è, né dovresti preoccuparti, tutto ciò che sei garantito è che supporta tutti i metodi definiti nell'interfaccia Iterator).

+0

Wow, non ci ho nemmeno pensato in questo modo. Molte grazie! –

0

Non è possibile creare un oggetto Iterator, ma è possibile creare un oggetto che implementa l'interfaccia Iterator. L'utilizzo di Iterator flavoursIter significa che non ti interessa quale implementazione.

0

Sei corretto. Iterator è un interface e quindi non può essere istanziato direttamente. Tuttavia, è possibile creare e creare un'istanza di un'implementazione della classe Iterator.

In sostanza, le classi che hanno il metodo iterator() hanno scritto le proprie implementazioni dell'interfaccia Iterator. iterator() crea un'istanza e restituisce un'implementazione di Iterator.

1

Come complemento alle altre risposte:

Molte classi implementano interfacce come Iterator come una classe interna privata, per poi tornare istanze di quella classe nascosta ogni volta che viene richiesto un esempio. Puoi leggere il codice sorgente del framework Collections se vuoi un esempio.

Il vantaggio principale di fare le cose in questo modo è nascondere i dettagli di implementazione. Un utente di un , ad esempio, non deve sapere quale classe concreta viene restituita quando chiama someList.iterator(), né ha bisogno di sapere quante diverse implementazioni di Iteraor sono disponibili nel framework Raccolte. Ciò consente ai creatori di questo framework di creare tutte le implementazioni necessarie in base alle loro esigenze (concurenza, efficienza, ecc.) E voi, in quanto utente del framework, non dovete imparare una miriade di classi.

0

Calcio, Quando abbiamo chiamato il metodo iterator(). Restituirà un'istanza di Iterator.for esempio

public Iterator iterator() { 
    return new ArryListIterator implments Iterator { 
     public T next() { // code for next() } 
     public boolean hasNext() {//code for hashNext()} 
     //others codes 

     } 

}

modo .whether di sapere che cosa è successo quando abbiamo chiamato.