標籤:
java內部類, 我在看《thinking in java》的時候總感覺模稜兩可的, 掙紮了好幾天之後, 感覺有一部分的問題想的清楚了, 寫一個隨筆記錄一下, 以備以後修改和查看
什麼是內部類?
內部類說白了就是類套類, 在一個類裡面寫一個類, 內部類分為兩種, 一種是普通內部類(non-static nested class), 第二種是靜態內部類(static nested class),也叫嵌套類.
普通內部類還包括兩種特殊的類型, 一種是局部內部類, 另一種是匿名內部類
內部類有什麼作用?
- 最簡單的功能 : 一種有效程式碼後置機制, 將某些功能放置在一起組合形成一個新的類, 而且這個新類可以任意訪問類的所有成員. 有效地提高了代碼的封裝型性, 使寫出來的代碼更加便於理解
- 實現了類邏輯上的分組: 比如 一個類A僅僅只對類B有用處, A是B的輔助類, 或者說僅希望A對B起作用, 那麼在邏輯上A已經屬於了B類, 內部類就恰好實現了這個邏輯
- 和interface一起真正實現了多重繼承 : 因為一個類允許存在多個內部類, 而內部類可以隨意訪問類的所有成員, 那麼就可以通過在不同的內部類繼承不同的類, 實現不同的介面在真正意義上完成多重繼承的任務.
- 通過內部類提供閉包的功能, 或者說類比閉包的功能(這部分暫時沒有完全弄明白)
什麼是閉包?
《thinking in java》有一段原話感覺很貼切:
閉包(closure)是一個可調用的對象, 這個對象記錄著一些資訊, 這些資訊來自於建立他的範圍.
通過回調, 對象可以攜帶一些資訊, 這些資訊允許它在將來某個時刻調用初始的對象.
內部類就是物件導向的閉包, 建立一個內部類, 就會得到一個外部類的引用, 通過這個引用, 我們可以調用外部類對象的所有成員, 當然這些成員就是所謂的“建立他的域的資訊”。除此之外,使用內部類完成閉包更加安全,因為返回的是一個引用,而不是一個指標,指標和引用可操作的許可權差異不止一點點。
為什麼普通內部類中不能包含static方法、static欄位和嵌套類?
因為static所修飾的屬性、方法都是和類相關,而非類對象相關。static成員的訪問可以直接通過classname.staticField進行,而內部類的建立是和外部類相關聯的,也就是要使用內部類,必須建立一個相關的外部類以提供引用,如果允許static成員的存在,那麼就可以通過Outer.Inner.staticField進行訪問,與是否存在外部類無關,所以不允許包含static成員。
但是普通內部類卻可以包含static final類型的成員, 因為static final類型的成員是靜態常量,在編譯期就會將所有用到該成員的地方替換成相對應的子面值常量。所以static final類型的成員只能使用常量運算式進行初始化。
例如:
class SS {public class Test1{public static final String str ="";public static final Integer d = new Integer(25) ; //報錯:The field d cannot be declared static in a non-static inner type, unless initialized with a constant expression}}
為什麼
//Java中普通內部類為何不能有static資料和static欄位,也不能包含嵌套類 :http://www.dewen.io/q/13793
//thinking in java筆記,如果有不對的地方,還望指正^_^
java內部類的一些看法