1. 程式人生 > >Java static和匿名內部類

Java static和匿名內部類

-- static Java中,任何變數 / 程式碼儲存時,都是 在編譯時 由系統自動分配記憶體; 在靜態變數編譯後,所分配的記憶體會一直存在,直到程式退出記憶體才會釋放這個空間; 類載入時,JVM會把靜態變數放到 方法區,被本類 & 本類的所有例項所共用。

-- 匿名內部類訪問外部私有屬性   Java為了避免資料不同步的問題,做出了匿名內部類只可以訪問final的區域性變數的限制。   巢狀類包括靜態內部類(Static Nested Classes)和內部類(Inner Classes)。而內部類分為成員內部類,區域性內部類(Local Classes)和匿名內部類(Anonymous Classes)。巢狀類包括靜態內部類(Static Nested Classes)和內部類(Inner Classes)。而內部類分為成員內部類,區域性內部類(Local Classes)和匿名內部類(Anonymous Classes)。在呼叫內部類的建構函式初始化內部類物件時, 會預設傳入外部類的引用。   匿名內部類是唯一一種沒有構造器的類。正因為其沒有構造器,所以匿名內部類的使用範圍非常有限,大部分匿名內部類用於介面回撥。匿名內部類在編譯的時候由系統自動起名為Outter$1.class。一般來說,匿名內部類用於繼承其他類或是實現介面,並不需要增加額外的方法,只是對繼承方法的實現或是重寫。   內部類物件的生命週期會超過區域性變數的生命週期。區域性變數的生命週期:當該方法被呼叫時,該方法中的區域性變數在棧中被建立,當方法呼叫結束時,退棧,這些區域性變數全部死亡。而內部類物件生命週期與其它類一樣:自建立一個匿名內部類物件,系統為該物件分配記憶體,直到沒有引用變數指向分配給該物件的記憶體,它才會死亡(被JVM垃圾回收)。所以完全可能出現的一種情況是:成員方法已呼叫結束,區域性變數已死亡,但匿名內部類的物件仍然活著。   匿名內部類物件可以訪問同一個方法中被定義為final型別的區域性變數。定義為final後,編譯程式的實現方法:對於匿名內部類物件要訪問的所有final型別區域性變數,都拷貝成為該物件中的一個數據成員。這樣,即使棧中區域性變數已死亡,但被定義為final型別的區域性變數的值永遠不變,因而匿名內部類物件在區域性變數死亡後,照樣可以訪問final型別的區域性變數,因為它自己拷貝了一份,且與原區域性變數的值始終一致。