1. java內(nèi)部類不設置成靜態(tài),實例化的時候顯得奇怪
普通內(nèi)部類在實例化時必須先有外部類對象,例如
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
靜態(tài)內(nèi)部類則可以直接實例化,例如
Outer.Inner inner = new Outer.Inner();
java內(nèi)部類設置成靜態(tài)在使用上更方便,尤其是作為工具類或輔助類時(Builder 模式,如 StringBuilder、Map.Builder)。
2. java內(nèi)部類不設置成靜態(tài),實例化的時候會導致內(nèi)存泄漏
內(nèi)存泄漏通俗來講就是藕斷絲連,然而藕斷絲連并沒有褒貶,但是內(nèi)存泄漏是我們不愿看見的。舉個不好的例子,即我們通常說的父債子還。如果一個爛賭的男人背負了巨額債務,即便是這位爛賭的男人死去了,討債方會繼續(xù)向這位爛賭的男人的后代討債,想象一下這位爛賭的男人的后代的人生將會是多么的悲慘,對他們來說,這就是“內(nèi)存泄漏”,即本該消亡的東西,卻因為一些關聯(lián),仍有一部分不能消亡。如果這位爛賭的男人沒有后代,或者他的后代早就和他斷絕了關系,那么他背負的巨額債務也會隨著男人的消亡而消亡。
普通的內(nèi)部類(非靜態(tài))會隱式持有外部類的引用,因此必須依附于外部類對象存在。靜態(tài)內(nèi)部類則不持有外部類對象的引用,可以直接通過 Outer.Inner 的形式使用,不需要創(chuàng)建外部類對象。好處: 減少內(nèi)存消耗(不會意外持有外部類的引用,避免內(nèi)存泄漏);使用上更靈活,可以像獨立類一樣使用。
3. java內(nèi)部類不設置成靜態(tài),成員變量管理起來比較混亂
當外部類和內(nèi)部類擁有相同的成員變量時,使用起來是比較麻煩的,比如下面的代碼:
public class ShadowTest {
public int x = 0;
class FirstLevel {
public int x = 1;
void methodInFirstLevel(int x) {
System.out.println("x = " + x);
System.out.println("this.x = " + this.x);
System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
}
}
public static void main(String... args) {
ShadowTest st = new ShadowTest();
ShadowTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}
運行結(jié)果是
x = 23
this.x = 1
ShadowTest.this.x = 0
4. java內(nèi)部類不設置成靜態(tài),也有好處
可以直接訪問父類的成員變量。如果把前面的爛賭的男人背負了巨額債務換成上進的男人積累了億萬家產(chǎn),那么他的后代將會繼承他的全部家產(chǎn)。對他的后代來講,是非常有益的。