2011-05-06 121 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