是否有可能爲接口創建對象,如果是的話我們怎麼辦? 根據我的看法如下代碼說,我們可以:我可以爲接口創建對象嗎?
Runnable r= new Runnable(){ // some implementation }
是否有可能爲接口創建對象,如果是的話我們怎麼辦? 根據我的看法如下代碼說,我們可以:我可以爲接口創建對象嗎?
Runnable r= new Runnable(){ // some implementation }
你不能直接實例化的界面,但你可以實例實現該接口的類:
public class RunClass implements Runnable {
// Class implementation
}
Runnable r = new RunClass();
這基本上和你在做的是一樣的。新的Runnable()後面的括號將包含內聯的實現。
這有點讓人誤解。 OP的問題使用匿名類語法,這可能就是關鍵。 –
這不是創建接口的實例,而是創建一個實現接口的類。所以,當你寫
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
這證明我們正在創建子類的實例。
謝謝你很好answar –
是否可以爲接口創建對象?
號還有你的代碼創建從匿名類,它實現了接口的對象。在封面下,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的行爲。)我們不能安裝接口(因爲沒有構造函數)。
我不這麼認爲Rais。可能你可以解決他的問題。它看起來完全回答我。 –
你的回答是正確的。我想合適的地方是評論,而不是回答。 –
您可以創建一個匿名內部類:
Runnable r = new Runnable() {
@Override
public void run() {
}
};
因此,您創建一個新的class
其實現給定interface
。
不,你不能。另外,所有的類都繼承自Object,而接口不是 – Ankit
你試過了嗎?在你的例子中,你創建了一個實現接口的匿名類的實例。 – Axel
相關概念:https://stackoverflow.com/questions/33994009/can-we-create-object-of-abstract-class –