天天看點

(轉)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)+"");
}
}
});      
(轉)Java靜态内部類的執行個體化問題

通過btn3列印的Log我們可以看到靜态内部類的對象不是同一個

另外為了驗證能不能及時回收,檢視記憶體使用情況的方法:

(轉)Java靜态内部類的執行個體化問題

data object後面的Total Size就是程式中對象占用的記憶體,檢測記憶體是否合理使用,你可以打開應該,來回的操作,看看TotalSize又沒有明顯的增長,正常情況下,如果沒有垃圾資料,記憶體會及時的被回收,TotalSize也就維持在相對穩定的數值,如果,一直在上漲說明你的程式就有OOM的風險了。