標籤:對象建立 匿名對象 匿名類 相關 基類 簡化 部分 增加 嵌套類
內部類
顧名思義,內部類就是在內部定義的類
內部類將類置於其他類的內部。看起來像一種程式碼後置機制。
內部類瞭解外圍類,並能與之通訊。
用內部類寫出的代碼更加優雅而清晰。
建立內部類
直接在類裡面寫類的定義即可
內部類的訪問特點
內部類可以直接存取外部類的成員,包括私人
外部類要訪問內部類的成員,必須建立對象
外部類名.內部類名 對象名 = 外部類對象.內部類對象
連結到外部對象
當產生一個內部類的對象時,此對象與製造它的外圍對象之間就有了一種聯絡,
所以它能訪問其外圍對象的所有成員,而不需要任何特殊條件。
此外,內部類還擁有其外圍類的所有元素的訪問權。
當某個外圍類的對象建立了一個內部類對象時,此內部類對象必定會秘密地捕獲一個指向那個外圍類對象的引用。
然後,在訪問外圍類成員時,就是用那個引用來選擇外圍類的成員。
內部類的對象只能在與其外圍類的對象相關聯的情況下才能被建立。
構建內部類對象時,需要一個指向外圍類對象的引用。
.this與.new
如果需要產生對外部類對象的引用,可以使用外部類名字後面緊跟圓點和this。
如果想告知某些其它對象,去建立其某個內部類的對象。可以使用其他外部類對的引用根圓點和new
在擁有外部類對象之前是不可能建立內部類對象的。
因為內部類對象會暗暗地串連到它的外部類對象上。
但是如果全是嵌套類(靜態內部類),那就不需要對外部類對象的引用。
內部類與向上轉型
當將內部類向上轉型為其基類,尤其是轉型為一個介面的時候,內部類很有用。
從實現了某個介面的對象,得到對此介面的引用,與向上轉型為這個對象的基類,實質上效果是一樣的。
這是因為此內部類---某個介面的實現---能夠完全不可見,並且不可用。
所得到的只是指向基類或介面的引用,所以能夠很方便地隱藏實現細節。
當取得了一個指向基類或介面的引用時,甚至可能無法找出它的確切的類型。
private內部類可以完全阻止任何依賴於類型的編碼,並且完全隱藏了實現的細節。
從用戶端程式員的角度來看,由於不能訪問任何新增加的、原本不屬於公用介面的方法,
所以擴充介面是沒有價值的。這也給java編譯器提供了產生更搞笑代碼的機會。
在方法和範圍內的內部類
如果實現了某類型的介面,於是可以建立並返回對其的引用
要解決一個複雜的問題,想建立一個類來輔助解決,但又不希望這個類是可共用的。
一個定義在方法中的類
一個定義在範圍中的類,此範圍在方法的內部
一個實現了介面的匿名類
一個匿名類,它擴充了有非預設構造器的類
一個匿名類,它執列欄位初始化
一個匿名類,它通過執行個體初始化實現構造(匿名類不可能有構造器)
匿名內部類
匿名內部類是局部內部類的一種,是一種簡化的寫法。
前提是存在一個類或者介面。這裡的類可以是具體類也可以是抽象類別
本質是一個繼承了該類或實現了該介面的子類匿名對象
嵌套類
如果不需要內部類對象與其外圍類對象之間有聯絡,可以將內部類聲明為static。
這樣的內部類稱為嵌套類。
當內部類是static時:
要建立嵌套類的對象,並不需要外圍類的對象
不能從嵌套類對象中訪問非靜態外圍類對象
普通內部類的欄位與方法,只能放在類的外部層次上,所以普通的內部類不能有static資料和static欄位,也不能包含嵌套類,
但是嵌套類可以包含以上的東西。
嵌套類不保留外部類的this引用,類似一個static方法
嵌套類可以作為介面的一部分。
內部類的繼承
內部類可以被覆蓋嗎
局部內部類
內部類別識別項
java 內部類