內部類 inner class (內聯類)
阿新 • • 發佈:2018-12-26
內部類的特點
內部類中的方法不僅可以訪問該類中的資料域,也可以訪問外圍類中的所有資料域(包括 私有域)
內部類對整個包中的其他的類是不可見的
如果想要定義一個回撥函式,又不想寫太多程式碼 現在多是使用(lambda表示式)
除此之外內部類還有另一個功能:內部類物件有一個隱式引用,指向建立了該內部類物件的外部類物件 但是 static的內部類沒有這個引用
外圍類的引用是在構造器中設定,編譯器會修改所有內部類的構造器,新增一個外圍類物件的引用引數
只有內部類是可以是私有類 常規類要麼是包可見 要麼是公有的。
編譯器會將內部類編譯成 $符號將 外圍類名和內部類名連線的常規類檔案,虛擬機器對此並不知情
內部類中 編譯器為了引用外圍類,生成一個附加的例項域this$0(由編譯器合成)
而為了使內部類能夠有訪問特權 編譯器
在外圍類中新增靜態方法 access$xxx()方法
這樣做是存在安全風險,任何人都可以通過呼叫這個靜態方法訪問私有域。熟悉類檔案的黑客就可以用16進位制的程式設計輕鬆的建立一個指令呼叫這個方法。由於這種隱祕的訪問方法擁有包可見,所以攻擊程式碼和被攻擊的類放在同一個包中
區域性類
當只有某個方法中需要出現內部類,那麼內部類就可以在這個方法中定義區域性類
區域性類對外界完全隱藏起來,被限制在宣告這個區域性類的塊中
匿名類 對區域性類深一步使用: 只需要建立這個類的一個物件 (Java程式設計師習慣使用匿名類實現事件的監聽和回撥,如今最好使用lambda表示式)
靜態內部類-----如果只需要將一個類隱藏在另一個類中,而不需要得到外部類的引用(如果內部類物件是在靜態方法中構造,則該內部類為static )