簡體   English   中英

為什么可以將匿名類的實例分配給Interface變量?

[英]Why an instance of anonymous class can be assigned to an Interface variable?

我是Java新手。 我有理解anonymous class instanceinterface之間的關系。 請參閱本網站中的示例:

// anonymous instance as a variable
Runnable r = new Runnable()
{
    @Override
    public void run()
    {
        //codes
    }
};

Thread t1 = new Thread(r, "anonymous 1");

// anonymous instance as a parameter
Thread t2 = new Thread (new Runnable()
{
    @Override
    public void run()
    {
        //codes
    }
}, "anonymous 2");

根據這個SO問題(http://stackoverflow.com/questions/11069056/why-java-interface-can-be-instantiated-in-these-codes)中的答案,我對匿名類有了基本的了解。

但是,我不明白這是什么:

Runnable r = new Runnable(){...};

在右側,我們創建了一個匿名類的實例,因此它是object of a classobject of a class 在左側,它是一個Interface變量。

為什么可以將匿名類的實例分配給Interface變量?

參考這個網站

Thread(Runnable target, String name)

似乎Thread期望第一個參數是一個Interface變量。

這段代碼......

Runnable r = new Runnable(){...};

Runnable類是一個接口,因此您無法直接創建它的實例。 但是,請注意{...}部分中的代碼 - 這是以本地化方式實現接口的方法。

基本上正在發生的是你正在創建一個接口實例,它只能由定義r的方法查看和使用。 由於您已在{...}部分中實現了所有方法,因此該類是有效的,您可以像使用任何其他Runnable對象一樣使用它。

這段代碼......

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

實際上與執行以下操作有效...

public class MyRunnable implements Runnable {
    public void run()
    {
        //codes
    }
};

// This goes in your class where you want to create the Runnable object
Runnable r = new MyRunnable();

這兩段代碼都將創建一個變量r ,它是一個Runnable實例。 第一個解決方案是創建實例的簡寫,對於不需要在其他任何地方重用的東西很有用。 第二個解決方案創建了一個單獨的類來實現接口,它可以在本地作用域之外重用。

我們能夠使用接口類型存儲變量,前提是分配給變量的對象實現接口。 所以,在代碼中......

Runnable r = new Runnable(){...};

我們說r實現了Runnable接口。 {...}的位是接口的實現位置,如前所述,所以一切正常。

僅當對象類實現該接口時,才能將對象分配給接口。 在這種情況下,您將創建一個實現Runnable接口的匿名類的對象,使其成為正確的賦值。

此外, Thread類具有非arg構造函數 這就是代碼編譯的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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