2010-10-16 4 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(); 
    } 
} 

Odpowiedz

16

Definiujesz anonimową klasę, która implementuje interfejs Int i natychmiast tworzy obiekt typu thatAnonymousClassYouJustMade.

+2

Jest to bardzo przydatne w przypadku procedur obsługi zdarzeń (takich jak te, które używają interfejsu ActionListener). –

4

Co to za specjalna składnia anonimowych klas wewnętrznych pod maską, to klasa o nazwie Test$1. Ten plik klasy można znaleźć w folderze klasy obok klasy Test, a jeśli wydrukowałeś t1.getClass().getName(), możesz to również zobaczyć.

7

Ten zapis jest skrótem

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"); 
    } 
} 

Więc w końcu tworzysz wystąpienie konkretnej klasy, której zachowanie zdefiniowano inline.

Możesz to zrobić również z klasami abstrakcyjnymi, zapewniając wbudowane implementacje wszystkich metod abstrakcyjnych.

0

Myślę, że twój obiekt nie ma nic wspólnego z interfejsem. Jeśli skomentujesz cały interfejs, nadal otrzymasz te same wyniki. Powstała właśnie anonimowa klasa. Myślę, że dopóki nie użyjesz klasy "narzędzi", nie możesz zaimplementować interfejsu. Ale nie wiem jak to się dzieje, że kolizja nazw nie ma miejsca w twoim przypadku.

+0

Klasa anonimowa zdecydowanie implementuje interfejs, a "t1 instanceof" będzie prawdziwe. – Thilo