2010-10-22 125 views
26
interface TestA { 
    String toString(); 
} 

public class Test { 
    public static void main(String[] args) { 
     System.out.println(new TestA() { 
      public String toString() { 
       return "test"; 
      } 
     }); 
    } 
} 

結果是什麼?我們可以創建一個接口的對象嗎?

A. test
B. null
C.在運行時拋出異常。
D.編譯失敗,因爲在線路中的錯誤1.
E.編譯失敗,因爲在線路中的錯誤4.
F.編譯失敗,因爲在線路5

錯誤什麼是答案的這個問題,爲什麼?關於這個問題,我還有一個疑問。在第4行中,我們創建了一個A的對象。是否可以創建一個接口的對象?

+11

貌似測試問題。順便說一句,你爲什麼不試試? – Kel 2010-10-22 19:04:22

+7

您通過運行它獲得的答案。 – Bozho 2010-10-22 19:04:25

+4

@凱爾:也許他想要解釋爲什麼這會起作用? – 2010-10-22 19:08:25

回答

5

test應該是輸出。這是一個匿名內部類的例子。

這是一種非常常見的與Comparator接口一起使用的模式,用於模擬閉包。

76

什麼,你在這裏看到的是一個anonymous inner class

考慮到如下界面:

interface Inter { 
    public String getString(); 
} 

您可以像像這樣的一個實例創造的東西:

Inter instance = new Inter() { 
    @Override 
    public String getString() { 
     return "HI"; 
    } 
    }; 

現在,你有一個你定義的接口的實例。但是,你應該注意到你實際上做了什麼定義了一個類來實現接口並同時實例化類。

+2

我一直在尋找它。它是一個非常簡短的答案。 +1簡單。 – amod 2012-07-10 14:31:05

+0

我想知道爲什麼這不被接受爲答案。 – 2012-12-13 10:29:06

+1

簡單和完美的答案,非常感謝 – smoothumut 2015-03-26 15:04:11

1

技巧並不完全是關於annonymous內部類,這打印測試原因它覆蓋toString方法,而System.out.println一個對象它隱式調用它的toString方法。

1

也試試這個...生成匿名類的名字!

Inter instance = new Inter() { 
    public String getString(){ return "HI"+this.getClass(); } 
}; 
-1

我不知道這個問題的意義。如果這是一個面試問題,那麼我可以說沒關係。但是實時地,這不是實施繼承的正確方法。所以要回答這個問題的答案,在這裏你所做的是一個匿名內部類

在這裏,你可以通過寫實例化一個實現繼承

System.out.println(new TestA() { 
    public String toString() { 
     return 「test」; 
    } 
}); 

和ofcourse結果將是test

相關問題