1. 程式人生 > >Java靜態內部類的例項化問題

Java靜態內部類的例項化問題

最近遇到的一個問題,記錄一下。
靜態內部類可以被例項化!
1.首先在外部類中的static方法中不能使用普通內部類,因為內部類必須要與外部類建立關聯才能使用,可以說是同生共死。
2.我在編碼過程中,需要2個類共同完成一個功能,其中一個工具類只會被用來完成這個功能,所以我選擇將這個類作為內部類,但是這個內部類與外部類又沒有直接的關聯(使用普通內部類,我需要new一個外部類,通過外部類才能new一個內部類,這樣顯然不合適),所以我選擇使用靜態內部類。
3.關於靜態內部類的物件:首先多次new是在堆中建立了不同的物件,和普通類的物件一樣。我在使用的時候,主要怕多個靜態內部類的物件在程式執行過程中像靜態成員變數一樣一直佔據記憶體空間導致OOM,經過驗證,靜態內部類的物件雖然每次new都生成一個物件,但是會被及時的回收,不會因為一直佔據記憶體空間導致OOM。

// 靜態內部類
private static class AA
    {
        int a;
    }
    btn1.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                for(int i = 0 ; i < 1000; i++)
                {
                // 靜態內部類可以被例項化
                    AA a = new
AA(); a.a = i; list.add(a); } } }); btn3.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { for(int i = 0 ; i < list.size(); i++) { // 不為同一個物件
Log.i("aaaa", list.get(i)+""); } } });

這裡寫圖片描述
通過btn3列印的Log我們可以看到靜態內部類的物件不是同一個

另外為了驗證能不能及時回收,檢視記憶體使用情況的方法:
這裡寫圖片描述
data object後面的Total Size就是程式中物件佔用的記憶體,檢測記憶體是否合理使用,你可以開啟應該,來回的操作,看看TotalSize又沒有明顯的增長,正常情況下,如果沒有垃圾資料,記憶體會及時的被回收,TotalSize也就維持在相對穩定的數值,如果,一直在上漲說明你的程式就有OOM的風險了。