2013-07-01 30 views
8

是否有可能爲接口創建對象,如果是的話我們怎麼辦? 根據我的看法如下代碼說,我們可以:我可以爲接口創建對象嗎?

Runnable r= new Runnable(){ // some implementation }

+0

不,你不能。另外,所有的類都繼承自Object,而接口不是 – Ankit

+0

你試過了嗎?在你的例子中,你創建了一個實現接口的匿名類的實例。 – Axel

+0

相關概念:https://stackoverflow.com/questions/33994009/can-we-create-object-of-abstract-class –

回答

11

你不能直接實例化的界面,但你可以實例實現該接口的類:

public class RunClass implements Runnable { 
    // Class implementation 
} 

Runnable r = new RunClass(); 

這基本上和你在做的是一樣的。新的Runnable()後面的括號將包含內聯的實現。

+5

這有點讓人誤解。 OP的問題使用匿名類語法,這可能就是關鍵。 –

14

這不是創建接口的實例,而是創建一個實現接口的類。所以,當你寫

Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 

     } 
    }; 

你實際上是創造出一種實現Runnable接口的類。 這裏需要遵守所有的規則,在這裏,我們要重寫run方法爲Runnable

There is similar thing for abstract class also. We can test using an example 

public abstract class AbstractClass { 

    public void someMethod(){ 
     System.out.println("abstract class"); 
    } 

} 

和其他類即TestClass

public class TestClass { 

    public static void main(String[] args) { 

     AbstractClass abstractClass = new AbstractClass() { 
      public void someMethod() { 
       System.out.println("concrete class method"); 
      } 
     }; 
     abstractClass.someMethod(); 
    } 
} 

這將創建我們在其中一個子類的實例覆蓋someMethod(); 這個程序打印

concrete class method 

這證明我們正在創建子類的實例。

+0

謝謝你很好answar –

6

是否可以爲接口創建對象?

號還有你的代碼創建從匿名類,它實現了接口的對象。在封面下,JVM實際上創建了一個實現該接口的類,然後創建該類的一個實例。


產生實際上有一個名稱的基礎上,出現這個代碼,例如YourClass$1或相似的類名「匿名」級。例如:

public class AnonymousName { 
    public static final void main(String[] args) { 
     Runnable r = new Runnable() { 
      public void run() { 
      } 
     }; 

     System.out.println(r.getClass().getName()); 
    } 
} 

...輸出

AnonymousName$1

;

(至少在Oracle的JVM,我不知道,如果命名約定是在JLS或者如果它是特定JVM的行爲。)
0

我們不能安裝接口(因爲沒有構造函數)。

+0

我不這麼認爲Rais。可能你可以解決他的問題。它看起來完全回答我。 –

+1

你的回答是正確的。我想合適的地方是評論,而不是回答。 –

8

您可以創建一個匿名內部類:

Runnable r = new Runnable() { 
    @Override 
    public void run() { 
    } 
}; 

因此,您創建一個新的class其實現給定interface

0

你看到的是一個anonymous inner class

它創建一個Runnable類的新匿名實現者實例。

由於匿名類定義是一個表達式,它必須是語句的一部分。

相關問題