代码:-
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. }-Am不能理解从第14行到第16行,因为我从来没有见过这样的东西fubar在一个method.Will任何机构,请解释14-16没有行?
发布于 2011-05-06 12:35:29
线路是错的。它应该在"new“和”Foo“之间有一个空格:
new Foo() { public int bar(){ return 1; } }这将创建一个实现Foo的匿名类型的实例。参见Java in a Nutshell: Anonymous Classes ( 3.12.3小节介绍了语法)。
匿名类通常与事件侦听器一起广泛使用。参见Swing Trail: Inner Classes and Anonymous Inner Classes (但忽略该部分顶部讨论的内部类;-)
祝你编码愉快。
评论:
第14行是对fubar (上面定义为public int fubar(Foo foo))的方法调用的开始。请注意,new ...是一个表达式(匿名类型或非匿名类型),表达式(新对象)的结果作为参数传递给fubar。格式很大程度上是任意的--它可以在一行中完成。考虑下面的代码:
Foo aNewFoo = new Foo() { ... };
fuubar(aNewFoo);希望这能把事情说清楚。
发布于 2011-05-06 12:36:27
这称为anonymous inner class。在执行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之间缺少的空格是错误的。)
发布于 2011-05-06 12:34:07
它被称为匿名内部类。您正在动态创建Foo的实现,而不必编写命名类。
Here is a potentially useful SO question关于它们是什么,以及你什么时候可能想要使用它们。
https://stackoverflow.com/questions/5906814
复制相似问题