Java基础 Java中关于内部类的小细节
2013-12-01 01:35
369 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
今天完成自己的事情后看了下老久前写的程序发现了个小问题便分享下
代码中将Component定义成静态内部类就好了,如下:
OK,就这么些了,是我以前没有注意的,给大家分享分享,高手请轻拍!
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
今天完成自己的事情后看了下老久前写的程序发现了个小问题便分享下
public class MyList<T> { public T get(int index) { if (index >= count) { throw new IndexOutOfBoundsException(); } return (T) arr[index]; } public int size() { return count; } public void add(T t) { if (count == arr.length) { Object[] temp = new Object[count * 2]; copyArr(arr, temp); destroyeArr(arr); arr = temp; } arr[count++] = t; } public Iterator<T> iterator(){ return new MyIterator(); } class Component { // 做些其他事情...... } class MyIterator implements Iterator<T>{ int current_index = 0; public boolean hasNext() { return current_index != count; } public T next() { T t = (T) arr[current_index++]; return t; } public void remove() { throw new UnsupportedOperationException(); } } private void copyArr(Object[] source, Object[] desc) { if (source != null) { for (int i = 0; i < source.length; i++) { desc[i] = source[i]; } } } private void destroyeArr(Object[] arr2) { for (int i = 0; i < arr2.length; i++) { arr2[i] = null; } } public Component getComponent(){ return new Component(); } private Object[] arr = new Object[32]; private int count = 0; }这个类是可以正常工作的,但是大家应该注意到MyList类中定义了两个类,一个MyIterator,还有一个Componet,其中只有MyIterator用到了外围类的变量,Component类没有用到,这就是我想要说的问题,我们都知道,一个非静态内部类都默认持有对外围类成员属性的引用,保存这些引用需要时间和空间,而且会导致外围实例在符合垃圾回收时却仍然得以保存,而得不到及时的垃圾回收。如果没有用到这些属性,这样做好像有点不好。所以,如果内部类没有用到外部类的成员属性则不要使用费静态内部类!
代码中将Component定义成静态内部类就好了,如下:
public class MyList<T> { @SuppressWarnings("unchecked") public T get(int index) { if (index >= count) { throw new IndexOutOfBoundsException(); } return (T) arr[index]; } public int size() { return count; } public void add(T t) { if (count == arr.length) { Object[] temp = new Object[count * 2]; copyArr(arr, temp); destroyeArr(arr); arr = temp; } arr[count++] = t; } public Iterator<T> iterator(){ return new MyIterator(); } // 改成静态内部类 static class Component { // 做些其他事情...... } class MyIterator implements Iterator<T>{ int current_index = 0; public boolean hasNext() { return current_index != count; } public T next() { T t = (T) arr[current_index++]; return t; } public void remove() { throw new UnsupportedOperationException(); } } private void copyArr(Object[] source, Object[] desc) { if (source != null) { for (int i = 0; i < source.length; i++) { desc[i] = source[i]; } } } private void destroyeArr(Object[] arr2) { for (int i = 0; i < arr2.length; i++) { arr2[i] = null; } } public Component getComponent(){ return new Component(); } private Object[] arr = new Object[32]; private int count = 0; }
OK,就这么些了,是我以前没有注意的,给大家分享分享,高手请轻拍!
相关文章推荐
- Java基础:关于Java编程语言中的内部类说明(摘)
- Java基础——关于抽象类,接口和内部类(inner class)的相关知识
- 关于java基础--内部类的讲解
- 黑马程序员--Java基础加强--14.利用反射操作泛型III【解析关于泛型类型的细节信息的获取方法】【Method与泛型相关的方法】【个人总结】
- 关于Java的一些基础细节(整理)
- 【JAVA基础】④关于重载,重写,抽象类,接口,内部类和单例模式
- [Java]Swing基础编程【3】内部类
- 关于JAVA匿名类和内部类的一点讨论
- JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
- 关于java初始化块的一些细节问题
- 关于JAVA匿名内部类,回调,事件模式的一点讨论
- java中关于try、catch、finally中的细节分析
- Java_基础—多线程(匿名内部类实现线程的两种方式和设置名字的方法)
- Java基础笔记-继承、抽象类、接口、多态、内部类、异常
- java基础知识小结之关于环境变量,标识符和整型值的三种交换形式
- 黑马程序员——Java语言基础:多态、内部类
- Java基础知识之系统命令调用、序列化、JDO、匿名内部类
- java基础15 内部类(成员内部类、局部内部类)和匿名内部类
- Java基础--关于static的变量和方法使用的一些不解
- 黑马程序员__关于自己的一些学习死角的再学习(基于老毕的java基础视频)