2011-09-27 11 views
2

爲什麼代碼以下工作作風:局部類定義:爲什麼這個工作

BroadcastReceiver receiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     //do something based on the intent's action 
    } 
} 

我希望它是:

private class MyBroadcastReceiver extends BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     //do something based on the intent's action 
    } 
} 

MyBroadcastReceiver receiver = new MyBroadcastReceiver(); 

在上面的第一個代碼塊,怎麼做編譯器知道receiver的類型是MyBroadcastReceiver而不是BroadcastReceiver?這不是曖昧嗎?爲什麼這是允許的?

如果我定義:

BroadcastReceiver receiver2 = new BroadcastReceiver(); 

現在是receiver == reciver2

編輯:
廣播接收器 http://developer.android.com/reference/android/content/BroadcastReceiver.html

+0

是'BroadcastReceiver'接口嗎? – adarshr

+0

No. http://developer.android.com/reference/android/content/BroadcastReceiver.html – Caner

回答

8

這是一個匿名類聲明。有關更多詳細信息,請參閱JLS的section 15.9.5

匿名類聲明自動從編譯器的類實例創建表達式派生。

的類型receiver變量的實際只是BroadcastReceiver - 但創建的對象的類型是ContainingClass$1一個實例,其延伸BroadcastReceiver

1

您在這裏創造一個無名類,它擴展BroadcastReciever。這在Java中是很常見的,例如創建聽衆。由於未命名的類擴展了BroadcastReciever,因此可以使用該類型的引用。

1

這被稱爲匿名內部類。正如這個名字所表明的,這樣的班級沒有名字。

它將被編譯爲一個.class文件名爲EnclosingClass$1.class。 receiver2變量的類文件將爲EnclosingClass$2.class

0

在上面的第一個代碼片段中,編譯器如何知道接收器是MyBroadcastReceiver而不是BroadcastReceiver

它不,你只是創建了一個anonymous class延長BroadcastReceiver的實例與具體實施。

現在是receiver == reciver2

顯然沒有:它們是兩個不同的實例(儘管它們都延伸BroadcastReceiver)。

1

在第一個示例中,類receiver不是MyBroadcastReceiver的實例;它是BroadcastReceiver的匿名實例。

BroadcastReceiver receiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 

    } 
} 

MyBroadcastReceiver myReceiver = new MyBroadcastReceiver(); 

(receiver instanceof MyBroadcastReceiver); // is FALSE 
(receiver instanceof BroadcastReceiver); // is TRUE