2013-06-04 58 views
0

我開始了與這個代碼,沒有編譯:「Anoynmous方法」有趣的行爲

Object[] obj= new Object[2]; 
obj[0]=new Object() { public String compute() {return "yay 1!";} }; 
obj[1]=new Object() { public String compute() {return "yay 2!";} }; 

for (Object o : obj) 
    System.out.println(o.compute()); 

因爲對象沒有爲它定義一個compute()方法。所以,我認爲java拋棄了這個功能;然而,下面的工作:

Object[] obj= new Object[2]; 
obj[0]=new Object() { public String toString() {return "yay 1!";} }; 
obj[1]=new Object() { public String toString() {return "yay 2!";} }; 

for (Object o : obj) 
    System.out.println(o); 

所以,java必須仍然有函數定義存儲在某處,對吧?或者是因爲我壓倒toString()

我的問題是如何告訴java compute()存在?

如果無法做到這一點,我可以像重寫第一個例子中那樣覆蓋Object中存在的方法嗎? compute()實際上代表的方法是採用int的方法。這可能是可怕的,但我應該覆蓋wait(long l)

在此先感謝。

+0

第二個作品,因爲'toString'是'Object'的方法之一... – assylias

回答

5

Java沒有「扔掉」該方法;你放入該陣列的實例擁有它,但是Java的類型系統沒有使它們可用於外部代碼的功能。例如,您可以通過反射驗證方法的存在。

如果您需要更多匿名類的方法,請定義一個合適的接口並使用new MyInterface() { ... }

+0

該計算方法()實際上代表的是一個接受'int'的方法。這可能是可怕的,但是我應該重寫'wait(long l)'來讓它起作用嗎? –

+0

重寫'wait'沒有理由。 –

+1

@SteveP。如果你確實需要一個'compute'方法,那你爲什麼不用這個方法定義一個接口並將它實現爲一個匿名的本地類? – assylias

1

這就是所謂匿名類

你定義一個匿名類

new Object() { public String compute() {return "yay 1!";} } 

你不能事後使用。

如果你已經宣佈

class Child { // extends Object { 

    public String compute() {return "yay 1!";} 

} 

,那麼你可以做

for (Object o : obj) 
    System.out.println(((Child)o).compute());