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
Definiujesz anonimową klasę, która implementuje interfejs Int
i natychmiast tworzy obiekt typu thatAnonymousClassYouJustMade
.
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ć.
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.
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.
Klasa anonimowa zdecydowanie implementuje interfejs, a "t1 instanceof" będzie prawdziwe. – Thilo
Jest to bardzo przydatne w przypadku procedur obsługi zdarzeń (takich jak te, które używają interfejsu ActionListener). –