Код: -
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. }
-Не мога да разбера от ред номер 14 до 16.Защото никога не съм виждал нещо такова fubar вътре в един метод.Ще всяко тяло моля обясни 14-16 без линия?
Отговори:
3 за отговор № 1Това се нарича анонимна вътрешна класа, В точката, която правите, се създава нов клас с генерирано от компилатор име new Foo() { ... }
, Този нов клас изпълнява Foo
интерфейс. Това е приблизително еквивалентно на:
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()
);
}
}
(Предполагам, че липсващото пространство между тях new
и Foo
в примера ви е грешка.)
3 за отговор № 2
Линията е грешна. Трябва да има интервал между "нов" и "Foo":
new Foo() { public int bar(){ return 1; } }
Това създава инстанция от анонимен тип, която изпълнява Foo
, виждам Java в съвкупност от думи: анонимни класове (раздел 3.12.3 обхваща синтаксиса).
Анонимните класове често се използват широко с слушателите на събития. виждам Swing Trail: Вътрешни класове и анонимни вътрешни класове (но не обръщайте внимание на Вътрешните класове, дискутирани в горната част на този раздел ;-)
Честит кодиране.
За коментар:
Линия 14 е началото на извикването на метода fubar
(което е дефинирано по - горе като public int fubar(Foo foo)
). Отбележи, че new ...
е израз (анонимни или не) и резултат на този израз (нов обект) се предава като аргумент към fubar
, Форматирането е предимно произволно - може да е било на една линия. Помислете за този код:
Foo aNewFoo = new Foo() { ... };
fuubar(aNewFoo);
Надявам се, че изчиства нещата.
2 за отговор № 3
Тя се нарича анонимна вътрешна класа. Вие създавате изпълнението на Foo
в движение, вместо да напишем име на класа.
Ето един потенциално полезен въпрос за SO за това какво са и кога може да искате да ги използвате.