• (转)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的风险了。

    转自:https://blog.csdn.net/u013318615/article/details/50316657

    其他文章:https://blog.csdn.net/unique_wz/article/details/48029867

  • 相关阅读:
    基于MQTT协议进行应用开发
    shell ss命令
    组播基本概念、IGMP、IGMP监听学习笔记
    关于Android的HAL的一些理解
    Android HAL层与Linux Kernel层驱动开发简介
    YPBPR_PC下图像有毛刺或者水纹干扰的处理办法
    CHAKRA3 UART2
    实际用户ID和有效用户ID (三) *****
    svn使用svnsync实现双机热备
    pyspider介绍及安装
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/9938369.html
Copyright © 2020-2023  润新知