2012-12-03 26 views
2

這可能是Java的一個非常基本的問題,但我不記得它,並且不知道如何在線搜索它。在Java中調用的這種實例化是什麼?

button.setOnClickListener(new OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
    Thread.sleep(100); 
    } 
} 

我習慣於使用像new OnClickListener(arg1, arg2, ...)這樣的構造函數初始化一個對象。以我自己的經驗,我從來沒有重寫過構建對象的方法。我只在擴展課程時做過。如果有任何術語,Java中稱這種實例化是什麼?我們還應該在什麼情況下使用它?

+1

該名稱是Java中的匿名類。現在您可以繼續關於此主題的研究。 –

+0

'OnClickListener'絕對是匿名實例化 – Chan

回答

5

這是一個匿名類。它是OnClickListener接口的實現,但該實現未命名。它的編寫簡潔,實現在調用上下文中可見(通常對可讀性有用),但由於它是就地實現的,所以不能在其他地方使用它。

還要注意它是一個內部類,因此對其周圍的類有一個引用。

有關更多信息,請參見here

Re。對周圍類的引用。一個內部類對其外部類有一個隱含的引用(如果你試圖使用XStream來序列化內部類,你可以看到這一點),它會將外部類與它一起拉出來。如果在外部類的變量,則可以在內部引用它(只要它是一個final變量,心)

+0

我不確定什麼「有參考其周圍的類」的意思。你能否說出一個可以使用這種參考的場景? –

+0

請參閱我的上述內容 –

3

他們被稱爲匿名類。

從技術上講,它們是實例化類的子類,並提供重寫的方法實現。

當你想提供一個實現而不必具體聲明一個頂級類時,它們很有用。

它們是Java對閉包的回答。

+1

對閉包的回答並不多* –

+0

+1提到Java的封閉答案。 –

2
new OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
    Thread.sleep(100); 
    } 
} 

無論從語法和語義的角度來看,這個構建體是實例的共混物和類聲明。同一呼吸中,您指定要調用哪個構造函數(接口被假定爲具有用於此目的的默認構造函數),並提供屬於您聲明的新子類的類體。你沒有給這個子類命名,這就是爲什麼這個構造被稱爲「匿名類」的原因。使用匿名類實例化與聲明緊密結合,並且除了聲明它的地方外,您不能從代碼中的任何其他點實例化此類。

在Java中有幾乎完全相同的結構,您幾乎從不會在實踐中看到它:本地類。它看起來就像一個普通的類聲明,但它在方法中發生,就像上面的匿名類一樣。在這種情況下,該類被賦予一個名稱,可以在幾個地方被引用和實例化,但是它們都在聲明的方法內部。

在這兩種情況下,您都可以獲得任何其他類別都無法使用的特殊功能,即可以使用方法中聲明的局部變量。起初這很奇怪,因爲當方法完成時局部變量消失,但是對本地類實例的引用繼續存在。這就是爲什麼這些類被稱爲「關閉」的原因:他們被稱爲「關閉」當地環境。它們會「提起」變量聲明並將它們作爲它們的實例變量。

1

只給一點如何可以這樣使用的例子...

public class TestClass { 
    public static void main(String args[]) { 
     OutOfTheMain ootm = new OutOfTheMain(); 
    } 
} 

public interface SuperInner { 
    String words = "hello"; 
    String getWords(); 
} 

public class OutOfTheMain { 
    OutOfTheMain() { 
     testInnerStuff(new SuperInner() { 
      @Override 
      public String getWords() { 
       return words + " world"; 
      } 
     }); 
    } 

    private void testInnerStuff(SuperInner sinner) { 
     System.out.println(sinner.getWords()); 
    } 
} 

跑時,這將打印...

hello world 

您可以覆蓋方法來添加附加功能並在運行時稍後使用此類。

相關問題