Kod:-
10. interface Foo { int bar(); }
11. public class Sprite {
12. public int fubar( Foo foo) { return foo.bar(); }
13. public void testFoo() {
14. fubar(
15. new Foo() { public int bar(){ return 1; } }
16. );
17. }
18. }
- Nie jestem w stanie zrozumieć z linii numer 14 do 16., ponieważ nigdy nie widziałem czegoś takiego w jednej metodzie. Jakiekolwiek ciało proszę wyjaśnić 14-16 bez linii?
Odpowiedzi:
3 dla odpowiedzi № 1To się nazywa anonimowa klasa wewnętrzna. Nowa klasa, z nazwą generowaną przez kompilator, jest tworzona w miejscu, w którym się znajduje new Foo() { ... }
. Ta nowa klasa implementuje Foo
berło. Z grubsza odpowiada to:
interface Foo { int bar(); }
public class Sprite {
public int fubar( Foo foo) { return foo.bar(); }
public class MyFoo implements Foo {
public int bar() { return 1; }
}
public void testFoo() {
fubar(
new MyFoo()
);
}
}
(Przyjąłem, że brakująca przestrzeń między new
i Foo
w twoim przykładzie jest błąd.)
3 dla odpowiedzi № 2
Linia jest błędna. Powinien mieć spację między "nowym" i "Foo":
new Foo() { public int bar(){ return 1; } }
Tworzy to wystąpienie anonimowego typu, który implementuje Foo
. Widzieć Java w skrócie: Anonymous Classes (sekcja 3.12.3 obejmuje składnię).
Anonimowe klasy są często szeroko używane ze słuchaczami zdarzeń. Widzieć Swing Trail: klasy wewnętrzne i anonimowe klasy wewnętrzne (ale ignoruj Klasy Wewnętrzne omówione na początku tego rozdziału ;-)
Szczęśliwe kodowanie.
Do komentarza:
Linia 14 jest początkiem wywołania metody fubar
(co zdefiniowano powyżej jako public int fubar(Foo foo)
). Zauważ, że new ...
jest wyrażeniem (typ anonimowy lub nie) i wynik tego wyrażenia (nowy obiekt) jest przekazywane jako argument fubar
. Formatowanie jest w większości arbitralne - mogło to być wszystko w jednym wierszu. Rozważ ten kod:
Foo aNewFoo = new Foo() { ... };
fuubar(aNewFoo);
Mam nadzieję, że to wszystko wyjaśni.
2 dla odpowiedzi nr 3
Nazywa się to anonimową klasą wewnętrzną. Tworzysz implementację Foo
w locie, zamiast pisać nazwaną klasę.
Oto potencjalnie przydatne pytanie SO o tym, czym są i kiedy zechcesz ich użyć.