(转)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
(转)Java静态内部类的实例化问题的更多相关文章
- 创建java类并实例化类对象
创建java类并实例化类对象例一1.面向对象的编程关注于类的设计2.设计类实际上就是设计类的成员3.基本的类的成员,属性(成员变量)&方法 面向对象思想的落地法则一:1.设计类,并设计类的成员 ...
- Java中创建实例化对象的几种方式
Java中创建实例化对象有哪些方式? ①最常见的创建对象方法,使用new语句创建一个对象.②通过工厂方法返回对象,例:String s =String.valueOf().(工厂方法涉及到框架)③动用 ...
- java 静态内部类小总结
内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权 ...
- java静态内部类理解
在Java世界里,经常被提到静态这个概念,static作为静态成员变量和成员函数的修饰符,意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见. ...
- Java 静态内部类的加载时机
参考文章:[https://www.cnblogs.com/maohuidong/p/7843807.html] 前言: 在看单例模式的时候,在网上找帖子看见其中有一种(IoDH) 实现单例的方式,其 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- 创建Java类并实例化深入理解
package com.sanguosha.java; import java.util.Scanner;//导入包 public class TestPerson { public static v ...
- 创建Java类并实例化的基本过程
package com.sanguosha.java; /* * 面向对象实现的过程 * 1.创建类并设计类的成员(成员变量即属性and成员方法即方法) * 2.通过类来创建类的对象,也称类的实例化 ...
- java 静态内部类特点
1.静态内部类可以在外部类的静态成员中访问或者实例化(非静态内部类不可以)---优势 2.静态内部类可以访问外部类的静态成员不可以访问非静态成员(非静态内部类可以访问类的静态和非静态成员)---限制 ...
随机推荐
- $(").each 和$.each
$(").each 这个是遍历dom树的,遍历数组的会报not afunction
- Echarts Map 值域为小数的原因
最近做一个项目用到了Echarts Map不知道怎么回事,有时多了一位小时,可这个意义不用小数表示(1.0个人似乎觉得有点奇怪嘞 {boolean}calculable false 是否启用值域漫游, ...
- 模板倍增LCA 求树上两点距离 hdu2586
http://acm.hdu.edu.cn/showproblem.php?pid=2586 课上给的ppt里的模板是错的,wa了一下午orz.最近总是被坑啊... 题解:树上两点距离转化为到根的距离 ...
- 分区实践 注意分区名 p2018-01 p2018-02 被解释为同一分区名
# https://dev.mysql.com/doc/refman/5.6/en/partitioning-columns-range.html'''CREATE TABLE employees ( ...
- Xcode报错Expected selector for Objective-C and Expected method body
昨天把键盘拿起来拍一下清清灰,然后就发现Xcode报错了,Xcode报错Expected selector for Objective-C and Expected method body,也不知道什 ...
- teamviewer 卸载干净
1 点击开始菜单,控制面板,卸载程序,找到软直接卸载2 按住Ctrl+R,输入%AppData%,删除teamview 相关文件夹3 输入regedit打开注册表HKEY_LOCAL_MACHINE\ ...
- hadoop 学习笔记2
============Hive vs Hadoop============== Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBase是为了支持弥补Ha ...
- LeetCode 429 N-ary Tree Level Order Traversal 解题报告
题目要求 Given an n-ary tree, return the level order traversal of its nodes' values. (ie, from left to r ...
- scala-模式匹配
option模式匹配: var map1=Map("abc"->5,"eee"->6) var x=map1.get("abc" ...
- idea+maven+springboot+mybatis+springmvc+shiro
springboot就是把创建项目简单化,省去了以往的配置mybatis.springmvc的繁琐过程. 搭建web应用三个主要功能,请求和响应,数据库交互,权限配置. 一.idea创建项目 (1) ...