java интерфейс проблем -

Код: -

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 за това какво са и кога може да искате да ги използвате.