2010-10-22 10 views
26
interface TestA { 
    String toString(); 
} 

public class Test { 
    public static void main(String[] args) { 
     System.out.println(new TestA() { 
      public String toString() { 
       return "test"; 
      } 
     }); 
    } 
} 

Qual è il risultato?Possiamo creare un oggetto di un'interfaccia?

A. Test
B. nullo
C. Un'eccezione viene generata in fase di esecuzione.
D. compilazione non riesce a causa di un errore nella riga 1.
E. compilazione non riesce a causa di un errore in linea 4.
F. compilazione non riesce a causa di un errore nella riga 5.

Qual è la risposta di questa domanda e perché? Ho un'altra domanda riguardo questa domanda. Nella riga 4 stiamo creando un oggetto di A. È possibile creare un oggetto di un'interfaccia?

+11

Sembra domanda di prova. A proposito, perché non ci provi? – Kel

+7

la risposta che otterresti eseguendola. – Bozho

+4

@Kel: Forse vuole una spiegazione del perché questo funziona? –

risposta

5

test dovrebbe essere l'uscita. Questo è un esempio di una classe interiore anonima.

Questo è un modello molto comune utilizzato con l'interfaccia Comparator come un'emulazione di chiusure.

76

Quello che state vedendo qui è un anonymous inner class:

Data la seguente interfaccia:

interface Inter { 
    public String getString(); 
} 

È possibile creare qualcosa di simile a un'istanza in questo modo:

Inter instance = new Inter() { 
    @Override 
    public String getString() { 
     return "HI"; 
    } 
    }; 

Ora, hai un'istanza dell'interfaccia che hai definito. Tuttavia, dovresti notare che ciò che hai effettivamente fatto è definito una classe che implementa l'interfaccia e istanziata la classe allo stesso tempo.

+2

Lo stavo cercando. È una risposta davvero breve e semplice. +1 alla sua semplicità. – amod

+0

Mi chiedo perché questo non è accettato come risposta. –

+1

risposta semplice e perfetta, grazie mille – smoothumut

1

Il trucco non riguarda esattamente la classe interna anonimo, questo test di stampa causa l'override del metodo toString e mentre System.out.println un oggetto chiama implicitamente il metodo toString.

1

Prova anche questo ... Il nome della classe annonymous viene generato!

Inter instance = new Inter() { 
    public String getString(){ return "HI"+this.getClass(); } 
}; 
-1

Non conosco il significato di questa domanda. Se questa è una domanda di intervista, allora posso dire che va bene. Ma in tempo reale non è l'approccio giusto per implementare un'eredità. Venendo alla risposta alla domanda, qui quello che stai facendo è una classe interna anonima .

Qui sono un'istanza di una classe di e attuare l'eredità scrivendo,

System.out.println(new TestA() { 
    public String toString() { 
     return “test”; 
    } 
}); 

e naturalmente il risultato sarebbe test

Problemi correlati