ListView优化中ViewHolder要不要定义为static静态内部类?

 给学生讲课的时候,发现存在这个问题,下来百度了下,发现很纠结,涉及到了内部类对外部类的引用,静态类的生命周期等java知识,现总结如下:

static class ViewHolder {

   //定义listView item中相应的控件

}

这里的ViewHolder类需不需要定义成static,根据实际情况而定,如果item不是很多的话,可以使用,这样在初始化的时候,只加载一次,可以稍微得到一些优化;

不过,如果item过多的话,建议不要使用。因为static是Java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(比如Context的情况最多),这时就要尽量避免使用了。

静态内部类不会存在外部类引用
非静态的, 每个ViewHolder都会保存一个外部类的引用.

一般的类是不允许static修饰的.
静态类仅表示这个类不依赖它的外部类而存在.  new一次肯定会分配一次内存,也就是说每一次如下new操作都会分配一次内存

holder = new ViewHolder();

为什么ViewHolder要使用static关键字去声明?

当一个内部嵌套类不依赖于外部类的时候,我们就会把它声明为静态的,在我们的案例中,ViewHolder从来没有使用到适配器类(外部类)的任何成员变量,因此我们可以把它声明为静态的,以保持它作为一个简单的静态嵌套类来维持外部类是一个嵌套的可读性,因为它的使用仅限于它的外部类,但是如果你要访问外部类的成员变量的话你的嵌套类必须声明为非静态的。

非静态的内部类对象隐式地在外部类中保存了一个引用,指向创建它的外部类对象。

静态类中可以定义静态方法和静态属性,也可以定义非静态方法和属性;但非静态类中不可以定义静态属性和方法。

参考:

static class 静态类(Java)_枝叶飞扬_新浪博客
http://blog.sina.com.cn/s/blog_605f5b4f0100zbps.html

非静态类中为什不能定义静态方法 - zcl1199的博客 - 博客频道 - CSDN.NET
http://blog.csdn.net/zcl1199/article/details/51723417

原文地址:https://www.cnblogs.com/bluestorm/p/5867061.html