靜態內部類主要做用就是,內部類是否須要隔離「外部類的this對象(指針)」。內部類是有 this 指針的,能夠「直接」訪問外部類的 成員變量和成員函數(包括私有的成員)。而靜態內部類,沒有這個this指針,因此沒法「直接」調用。android
ViewHolder的構造和複用,與靜不靜態沒關。核心是ListView(AdapterView),經過getView(int position, View convertView, ViewGroup parent) 的convertView會爲開發者傳入一個能夠複用的對象。開發者須要利用該對象,減小應用內存的消耗。函數
而用static的真正目的實際上是this
從減小內存消耗的角度來看。ViewHolder仍是應該修飾成static比較好。這樣ViewHolder中能夠減小Activity的this指針,因爲減小了一個this指針的引用,也會對Activity的引用計數大大減小。Activity的this指針繼承於android的Context上下文,對於Context的回收遺漏,是Android內存管理中很大的問題。咱們減小了對Context的引用,能夠更容易減小Context引用計數出現問題。指針
而這個解釋來自於對象
《Effective Java》第22條 優先考慮靜態成員類繼承
其中有條建議:內存
若是聲明成員類不要求訪問外圍實例,就要始終把static修飾符放在它的聲明中,是它成爲靜態成員類,而不是非靜態成員類。開發
由於非靜態成員類的實例會包含一個額外的指向外圍對象的引用,保存這份引用要消耗時間和空間,而且致使外圍類實例符合垃圾回收時仍然被保留。若是沒有外圍實例的狀況下,也須要分配實例,就不能使用非靜態成員類,由於非靜態成員類的實例必需要有一個外圍實例。get