2011-06-28 38 views
2

我有一個類似的Java代碼:java的括號使用

AnObject anObject = new AnObject() { 
    int count; 
    public int creation() { 
     return count; 
    } 
}; 

我無法理解的大括號的意思。一個遵循構造函數的類? 謝謝!

回答

15

這是一個anonymous inner class

基本上,它是AnObject沒有名字的子類。

匿名,因爲它不具有一個類名稱聲明(例如class Foo),並且這是因爲它被另一個類中定義(其不似乎在提供的代碼中所示的內部類。 )

javac通常會命名這些類與一個$包含類和一些數字標識符,如Foobar$1 - 你可能會發現你<EnclosingClass>$1.class編譯代碼之後。

(其中<EnclosingClass>是包含匿名內部類的類。)

+0

不檢查,我想你會發現一個 $ 1.class您編譯代碼之後。 – Puce

+0

@Puce我檢查了你是正確的 - 它是在'class'文件名中使用的封閉類的名稱。編輯答案。謝謝! :) – coobird

1

在這種情況下在大括號用於創建的AnObject一個匿名子類。大括號內是作爲覆蓋超類的方法的新字段和方法。對於更簡單的抽象類或接口,這種模式非常普遍,例如「就地」創建偵聽器。

4

這是一個匿名的內部類。

的代碼幾乎是一樣的:

private class Foo extends AnObject { 
    int count; 
    public int creation() { return count; } 
} 
... 
AnObject anObject = new Foo(); 

有一些細微的差別,但:

  1. 的語法是擴展類和實現接口相同。
  2. 封閉方法的局部變量是可見的,但只有那些聲明爲final的。