2014-02-08 75 views
3

在我的CS110課程中,我們正在開發一個使用Google Maps API的Android應用程序,以及Observer設計模式中教授的其中一個概念。設計模式教導了發佈者和訂閱者的概念。所以當發佈者的狀態發生變化時,它會通知所有訂閱者。在這個例子中,LocationListener是一個訂戶,但實現很混亂。該代碼如何能夠從接口實例化新對象?

的代碼片段如下所示:

LocationListener locationListener = new LocationListener() { 
    public void onLocationChanged(Location location) { 
    // Called when a new location is found by the network location provider. 
    makeUseOfNewLocation(location); 
    } 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
    public void onProviderEnabled(String provider) {} 
    public void onProviderDisabled(String provider) {} 
}; 

LocationListener的是一個接口,而我的理解是,你不能實例化一個接口。然而,LocationListener locationListener...聲明是從Interface創建一個對象,這是如何實現的?

另外,我的理解是這是一個匿名類。我不太清楚我明白一個班級是匿名的意味着什麼。我明白匿名這個詞的含義,但不是在課堂上。

任何幫助澄清這裏發生的事情將不勝感激。

+0

你正在實現使用匿名內部類的接口 – Raghunandan

+0

看看[這個匿名類的問題](http://stackoverflow.com/questions/355167/how-are-anonymous-inner-classes-used-在-JAVA)。這對我幫助很大。 –

回答

1

LocationListener是一個界面!

而且locationListener不是一個對象,而是類LocationListener

的參考在你的代碼你正在做的是:

你正在創建類LocationListener..If類A的參考實現接口B然後接口B的引用可以保存類A的對象。你正在做同樣的事情。

Anonymous類是一個沒有顯式聲明和定義的類。所以在這部分

new LocationListener() { 
    public void onLocationChanged(Location location) { 
    // Called when a new location is found by the network location provider. 
    makeUseOfNewLocation(location); 

你正在定義一個匿名類,它實現了接口LocationListener

因此,參考locationListener是持有該匿名類的對象!

希望這可以解釋你的問題!