最近遇到的一個問題,記錄一下。
靜態內部類可以被實例化!
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的風險了。