1. 程式人生 > 其它 >《深入理解JAVA虛擬機器》(一) JVM 結構 + 棧幀 詳解

《深入理解JAVA虛擬機器》(一) JVM 結構 + 棧幀 詳解

內部類

  • 如果定義類在區域性位置(方法中 程式碼塊):區域性內部類 匿名內部類
  • 定義在成員位置 成員內部類 靜態內部類

基本介紹

  • 一個類的內部又完整的嵌套了另一個類結構,被巢狀的類稱為內部類,巢狀其他類的類稱為外部類,是我們類的第五大成員

  • 類的五大成員是那些

    • 屬性
    • 方法
    • 構造器
    • 程式碼塊
    • 內部類
  • 內部類最大的特點就是可以直接訪問私有屬性,並且可以體現類與類之間的包含關係

基本語法

class Outer{ //外部類
    class Inner{
        //內部類
    }
}
class Other{
    //外部其他類
}

內部類的分類

  • 定義在外部類區域性位置上(比如方法內)

    • 區域性內部類
    • 匿名內部類
  • 定義在外部類的成員位置上

    • 成員內部類
    • 靜態內部類

區域性內部類使用

區域性內部類是定義在外部類的區域性位置,比如方法中,並且有類名

  1. 可以直接訪問外部類的所有成員,包括私有的
  2. 不能新增訪問修飾符,因為它的地址就是一個區域性變數,區域性變數是不能使用修飾符的,但是可以使用final修飾,因為區域性變數也可以使用final
  3. 作用域:僅僅在定義它的方法或者程式碼塊中
  4. 區域性內部類訪問外部類成員:直接訪問
  5. 外部類訪問區域性內部類的成員:建立物件再訪問
  • 區域性內部類定義在方法中或程式碼塊中
  • 作用域在方法體或者程式碼塊中
  • 本質仍是一個類
  1. 外部其他類不能訪問區域性內部類,因為區域性內部類的地位是一個區域性變數
  2. 如果外部類和區域性內部類的成員重名時,預設遵循就近原則,如果想訪問外部類的成員則可以使用 外部類名.this.成員 訪問

匿名內部類使用

  1. 本質是類
  2. 內部類
  3. 該類沒有名字
  4. 同時還是一個物件
  5. 說明
    • 匿名內部類是定義在外部類的區域性位置,比如方法中,並且沒有類名
    • 基本語法
new 類或介面(引數列表){
   類體 
};
注意事項
  1. 匿名內部類的語法比較奇特,因為匿名內部類既是一個類的定義,同時它本身也是一個物件,因此從語法上看,它既有定義類的特徵,也有建立物件的特徵,因此可以呼叫匿名內部類方法
  2. 可以直接訪問外部類所有成員,包括私有的
  3. 不能新增訪問修飾符,因為它的低位就是一個區域性變數
  4. 僅僅作用與方法或程式碼塊中
  5. 匿名內部類訪問外部類成員直接訪問
  6. 外部其他內不能訪問匿名內部類
  7. 如果外部類和匿名內部類的成員重名時,匿名內部類訪問的話,預設遵循就近原則,如果想訪問外部類的成員,則可以使用 外部類名.this.成員訪問

成員內部類

成員內部類是定義在外部類的 成員位置,並且沒有static修飾

  1. 可以直接訪問外部類的所有成員,包括私有的
  2. 可以新增任意訪問修飾符,因為它的地位就是一個成員
  3. 作用域:和外部類其他成員一樣,為整個類體,在外部類的成員方法中建立成員內部類,再呼叫方法
  4. 成員內部類訪問外部類成員,直接訪問
  5. 外部類訪問成員內部類建立物件再訪問
  6. 如果外部類和內部類的成員重名時,內部類訪問的話,預設遵循就近原則,如果想訪問外部類的成員,則可以使用 外部類名.this.成員 訪問

靜態內部類使用

靜態內部類是定義在外部類的成員位置,並且有static修飾

  1. 可以直接訪問外部類的所有靜態成員,包含私有的,但不能直接訪問非靜態成員
  2. 可以新增任意訪問修飾符,因為它的地位就是一個成員
  3. 作用域:同其他類的成員,為一個整體
  4. 靜態內部類訪問外部類 直接訪問所有靜態成員
  5. 外部類訪問靜態內部類 建立物件再訪問
  6. 如果外部類和靜態內部類的成員重名時,靜態內部類訪問時,預設遵循就近原則,如果想訪問外部類的成員,則可以使用 外部類名.成員 訪問