2012-04-18 14 views
6

Quindi ho appena trovato questo esempio di codice online qualche tempo fa e lo ripasso ma piuttosto confuso.Java - Interfaccia, creazione di istanze di un'interfaccia?

Dall'osservarlo, ciò che raccolgo (e potrebbe essere errato) è che passa al metodo di stampa nella classe NumberPrinter un oggetto Stampante. Tuttavia, l'interfaccia è anche chiamata stampante, quindi non stiamo istanziando una classe anonima dell'interfaccia della stampante, definendone i metodi e poi passandoli?

La mia domanda di base è, la mia ipotesi iniziale è corretta? E se così fosse, ho pensato che non potevi istanziare un'interfaccia?

public class NumberPrinter { 

    public interface Printer { 
     public void print (int idx); 
    } 

    public static void print (Printer p) { 
     for (int i = 0; i < 4; i++) { 
      p.print(i); 
     } 
    } 

    public static void main(String[] args) { 
     print(new Printer() { 

      @Override 
      public void print(int idx) { 
       System.out.println(idx); 
      } 

     }); 
    } 

} 
+0

Sembra che potrebbe essere una domanda doppia. Prova ad andare qui http://stackoverflow.com/questions/4000062/can-we-create-an-object-of-an-interface – astidham2003

risposta

17

Questo viene chiamato anonima classe interna.

Crea una classe non denominata che implementa l'interfaccia Printer.

+0

Ah, penso di averlo capito! – mino

3

L'ipotesi è corretta e non è possibile creare un'istanza di un'interfaccia. È possibile creare un'istanza di una classe anonima, che è ciò che sta facendo il codice.

+0

Così puoi istanziare una classe interna anonima di un'interfaccia? – mino

+0

Sì, è corretto. –

1

È necessario un oggetto Stampante per la funzione di stampa di NumberPrinter. Quando si chiama quella funzione, in realtà non si crea un'istanza dell'interfaccia della stampante, ma si crea un'istanza di un'implementazione e questo è il motivo per cui funziona.

La tua ipotesi era corretta a proposito.

+0

Allora, mi dispiace, sono confuso perché puoi passarlo ad una classe interiore anonima? È un oggetto di tipo Stampante? – mino

+0

Poiché questa è una classe interiore anonima, non c'è alcun riferimento a cui fare riferimento, quindi non penso che ci sia alcun oggetto Printer qui. La nuova chiamata Printer() crea una nuova istanza di quella classe e la restituisce come risultato dell'istruzione. – Chris911