2011-05-06 96 views
3

代码: -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. } 

-Am不能够从行数14〜明白16.because我从来没有见过一个method.Will任何身体里面这样的事情FUBAR请解释14-16没有线?

+0

线15包含一个错误。它应该是新的Foo(...不是newFoo(... – Jerome 2011-05-06 04:39:47

+1

@Jerome - 固定 – MeBigFatGuy 2011-05-06 04:45:12

回答

2

它被称为匿名内部类。您正在创建Foo的实现,而不必编写指定的类。

Here is a potentially useful SO question关于它们是什么以及什么时候可能想要使用它们。

+0

我得到了你的解释,但是什么是第14行的fubar?因为它内部的一个方法testFoo。 – mriganka3 2011-05-06 04:48:33

+0

'fubar()'只是一种方法调用'testFoo()'方法调用'fubar()' – QuantumMechanic 2011-05-06 04:52:22

3

该行是错误的。它应该有“新”和“富”之间的空间:

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); 

希望能够解决问题。

+0

我得到了你的解释,但是第14行的fubar是什么?因为它里面的一个方法testFoo。 – mriganka3 2011-05-06 04:45:33

+0

@mrig更新回答你:) – 2011-05-06 04:47:18

3

这被称为anonymous inner class。在您做new Foo() { ... }处创建一个带有编译器生成名称的新类。这个新类实现了Foo接口。这大致相当于:(我假设在你的榜样newFoo之间缺少空间是一个错误)

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() 
     ); 
    } 
} 

+0

Thanx now i热所有的解释。 – mriganka3 2011-05-06 05:14:51