2010-10-16 7 views
9
interface Int { 
    public void show(); 
} 

public class Test {  
    public static void main(String[] args) { 
     Int t1 = new Int() { 
      public void show() { 
       System.out.println("message"); 
      } 
     }; 

     t1.show(); 
    } 
} 

risposta

16

Si sta definendo una classe anonima che implementa l'interfaccia Int e creando immediatamente un oggetto di tipo thatAnonymousClassYouJustMade.

+2

Questo è davvero utile per i gestori di eventi (come quelli che utilizzano l'interfaccia ActionListener). –

4

Ciò che questa speciale sintassi per le classi interne anonime fa sotto il cofano crea una classe chiamata Test$1. Puoi trovare quel file di classe nella cartella della classe accanto alla classe Test e se hai stampato t1.getClass().getName() potresti anche vederlo.

7

Questa notazione è una scorciatoia per

Int t1 = new MyIntClass(); 

// Plus this class declaration added to class Test 
private static class MyIntClass implements Int 
    public void show() { 
     System.out.println("message"); 
    } 
} 

Così alla fine si sta creando un'istanza di una classe concreta, il cui comportamento è stato definito in linea.

È possibile farlo anche con classi astratte, fornendo implementazioni per tutti i metodi astratti in linea.

0

Penso che il tuo oggetto non abbia nulla a che fare con l'interfaccia. Se commentate l'intera interfaccia, otterrete comunque lo stesso risultato. È stata creata la sua classe anonima. Penso che, a meno che tu non usi la classe "implementa", non puoi implementare l'interfaccia. Ma non so come la denominazione della collisione non avvenga nel tuo caso.

+0

La classe anonima implementa definitivamente l'interfaccia e 't1 instanceof Int' sarà vera. – Thilo

Problemi correlati