天天看點

thinking in java 筆記--内部類的規則inner class rules(2007.10.12)

java的内部類有一些預設的規則 

1.  非static的内部類是不能有static成員(field)和方法的.這可能是因為非static的内部類必須要擁有其宿主類的reference有關,如果内部類有一個static的成員,那麼就不用建立宿主的對象就可以通路非static内部類的成員,這樣的話就與必須擁有宿主類的對象沖突了.

2.   static的内部類是不能用到非static的成員和方法的.這點和正常類相同

3.    static的内部類,如果你不去觸發它的時候,它是不會進行初始化的.這裡要和static變量的初始化區分好.

4.    如果引用宿主類的指針(reference),必須明确調用OuterClass.this,在内部類中用this指的是内部類目前的對象,要與宿主類的OuterCalss.this區分好,特别是兩個類中有相同名稱的變量時(但這種情況我們怎麼會做呢)

5.    必須用宿主類的對象來建立内部類的對象,也就是内部類(非static)裡面必須有一個指針是指向它的宿主類的

OuterClass outer  =  new OuterClass();   

OuterClass.InnerClass inner  =  outer.new InnerClass();

.new 指明了正确的作用域,是以不用在調用外部類的構造函數再去限定内部類的名字,像這樣outer.new OuterClass.InnerClass.

6.内部類用this時要小心,實際上内部類用到的還是它自己.就是說每個成員與方法前的指針都是它自己--this,這樣如果在内部類中有一個成員或方法與宿主類的成員或方法名稱是一樣的,那麼在内部類中去調用這個成員或方法實際上相當于是調用 this.name, 或this.getName().如果類沒有繼承任何類,那麼類中的super與this 指向的是同一個地方.

7.    内部類的繼承必須要傳遞所繼承的類的宿主的對象,而且要在構造方法中調用 enclosingClassReference.super()

8.    宿主類的reference是被内部類引用 的,是以隻有當全部的内部類沒有被引用的時候,宿主類才會被回收.

9.    放到方法内部的類稱為本地内部類(local inner class),所用到的參數必須是final的.

10.  如果方法裡的匿名類沒有直接使用傳進來的參數,而是把這個參數傳給了它實作的類,例如内部類隻是把參數通過構造方法傳遞給了父類,那麼這個參數可以不做成final的

11.  方法裡的内部類的修飾符隻能有abstract和final

12,  利用本地内部類來替換匿名内部類的唯一正當理由是你需要一個有名字的構造方法,因為匿名内部類隻能進行執行個體初始化  { ...........},本地内部類的名字在方法外是不能用的