![](/img/trans.png)
[英]Why can't we instantiate an interface or an abstract class in java without an anonymous class method?
[英]Can we create instantiation of interface and abstract class with the help of anonymous class in Java?
我去采訪了。 采訪者問我是否可以實例化一個接口和抽象類? 據我所知,我說“不”。 但他說“是的,我們可以借助匿名課程”。
你能告訴我怎么樣嗎?
這是一個棘手的問題。
不,你不能實例化一個接口或抽象類。
但是,您可以實例化一個實現/擴展接口或抽象類的匿名類,而無需定義類對象。 但它只是定義一個完全命名的類的捷徑。
所以我會說技術上你的答案是正確的。
我不知道什么是“接口和抽象類的實例化” 。 我認為這是一種不准確,不恰當的表達,我們只能猜測其意圖。
您無法在Java中創建接口實例或抽象類。
但是您可以創建實現接口或抽象類的匿名類。 這些不是接口或抽象類的實例。 它們將是匿名類的實例。
這是來自Iterator接口的示例迭代器,它為您提供了“不真實”的無限:
new Iterator<String>() {
@Override
public boolean hasNext() {
return true;
}
@Override
public String next() {
return "not really";
}
};
或者是一個包含5“not really”的時髦AbstractList
:
List<String> list = new AbstractList<String>() {
@Override
public int size() {
return 5;
}
@Override
public String get(int index) {
return "yes";
}
};
假設您有一個抽象類: MyAbstractClass
帶有抽象的void方法myAbstractMethod
。 然后你可以通過這段代碼創建這個類的“實例”:
MyAbstractClass myAbstractClassInstance = new MyAbstractClass() {
public void myAbstractMethod() {
// add abstract method implementation here
}
};
在這種情況下, myAbstractClassInstance
擴展了MyAbstractClass
。 當您實例化此類時,您必須實現所有抽象方法,如上面的代碼所示。
相同的方式適用於接口,假設您有一個接口MyInterface
其中包含一個void方法myInterfaceMethod
,然后您可以通過以下代碼創建一個“實例”(此實例的實現):
MyInterface myInterfaceImpl = new MyInterface() {
public void myInterfaceMethod() {
// add method implementation here
}
}
myInterfaceImpl
是的implemetation MyInterface
在這種情況下。 使用interface創建對象時,必須實現上面顯示的接口方法。
您無法使用new
運算符創建抽象類或接口的實例。 例如,
new AbstractSet(); // That's wrong.
但是,您可以使用它們來聲明引用變量。 例如,您可以這樣做:
AbstractSet set;
您可以實例化匿名以及聲明的實現類或子類。
例如, Set
extends AbstractSet
,因此您可以實例化Set
。
界面:
interface Interface1 {
public void m1();
}
當你正確的時候
new Interface1() {
public void m1() {
}
}
它實際上並沒有創建Interface實例。 它創建了一個沒有任何名稱/引用的子類型的實例。 因此,我們無法創建接口或抽象類的實例
是的,我們可以通過在實例化過程中動態定義抽象方法或接口方法來創建。 這就像一個命名的匿名類。
//interface
Runnable r = new Runnable(){
public void run() {
System.out.println("Here we go");
}
};
//Abstract class
abstract class MyAbstract {
abstract void run();
}
MyAbstract ab = new MyAbstract(){
@Override
void run() {
System.out.println("Here we go");
}};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.