2013-10-04 78 views
0

下面的代碼是使用匿名類實現的對象的實例化。什麼時候創建並訪問這個匿名類對象,以及何時收集垃圾?

我不清楚的是由匿名類創建的對象的確切生命期。

PictureCallback jpegCallback; 

創建PictureCallback類型的變量和名字jpegCallback分配給它。這個變量是MainClass類的成員變量。

接下來它實例化一個PictureCallback類型的新對象並將其存儲到jpegCallback變量中。

我不明白什麼時候執行這段代碼。因爲PictureCallback jpegCallback變量是MainClass的成員,所以它看起來像在MainClass由類加載器加載時一樣,同時它也是MainClass的其他成員變量和靜態變量。

因此,如果這是真,那麼PictureCallback匿名類必須以同樣的方式作爲靜態內部類或靜態變量來創建。在運行時開始。

匿名對象必須像靜態一樣存在,因爲如果它在運行時的中間停止存在,那麼如果調用回調方法,則覆蓋方法中定義的操作不會發生,因爲該對象不再存在。

我最好的猜測是,這個對象像一個靜態對象創建爲MainClass被加載並繼續進行,直到MainClass被破壞。

有人可以解釋什麼時候這個匿名類對象存在,什麼時候它被垃圾收集器清除或不再可訪問?

public class MainClass extends Activity { 

    PictureCallback jpegCallback = new PictureCallback() { 

      @Override void onPictureTaken(byte[], data, Camera camera){ 

       // some action performed 

      } 

    } 

} // end of MainClass 

回答

2

什麼,我不明白的是什麼時候是每當執行的MainClass實例這段代碼執行

。請注意,創建的MainClass的每個實例都將反過來創建一個匿名類的新實例。

因爲PictureCallback jpegCallback變量是MainClass的一員,它看起來像當MainClass由類加載器加載,在它的其他成員變量和MainClass的靜態變量同時它必須創建。

不,完全沒有。它不是一個靜態變量,因此在初始化時不會初始化 - 它僅在初始化實例時初始化。

所以如果這是真的,那麼PictureCallback匿名類必須以與靜態內部類或靜態變量相同的方式創建。在運行時開始。

我希望在創建MainClass的第一個實例時初始化類本身。

我最好的猜測是,這個對象被創建爲一個靜態對象,因爲MainClass被加載並且它一直持續到MainClass被銷燬。

不,它的處理方式與任何其他實例變量一樣。假設沒有其他對該對象的引用,那麼當MainClass實例有資格進行垃圾回收時,它將有資格進行垃圾回收。

你可以把你的代碼爲這樣的:

public class MainClass extends Activity { 

    PictureCallback jpegCallback; 

    public MainClass() { 
     jpegCallback = new PictureCallback() { 
       @Override void onPictureTaken(byte[], data, Camera camera) { 
        // some action performed 
       } 

     }; 
    } 
} 

這是否幫助?不要忘記,就運行時而言,匿名類只是一個擴展了PictureCallback的類,並且引用了MainClass的一個實例。它並不關心它是由編譯器合成的。

+0

是的。我忘了......創建靜態變量和實例變量之間存在巨大差異。 – Kevik

1

A PictureCallback使用MainClass(它在實例字段中聲明並初始化)的每個實例創建實例。

只要關聯的MainClass實例處於有效狀態,實例就有資格進行垃圾回收。發生這種情況是因爲匿名內部類實例對封閉類實例具有隱式引用。