最近遇到的一个问题,记录一下。
静态内部类可以被实例化!
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的内部类实例化外部类会自己执行吗 内部类如何实例化_android内存_02


data object后面的Total Size就是程序中对象占用的内存,检测内存是否合理使用,你可以打开应该,来回的操作,看看TotalSize又没有明显的增长,正常情况下,如果没有垃圾数据,内存会及时的被回收,TotalSize也就维持在相对稳定的数值,如果,一直在上涨说明你的程序就有OOM的风险了。