簡體   English   中英

我們可以借助Java中的匿名類創建接口和抽象類的實例化嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM