【Java筆記】java內部類
阿新 • • 發佈:2021-07-12
Java內部類
如果一個事物內部包含另一個事務,那麼這就是一個類內部包含另一個類
例如:身體和心臟的關係,汽車和發動機的關係
分類
- 成員內部類
- 區域性內部類(包含匿名內部類)
成員內部類的定義格式
修飾符 class 外部類名稱{
修飾符 class 內部類名稱{
}
}
注意:內用外,隨意訪問;外用內,需要內部類物件;
成員內部類的使用方法
- 間接使用:在外部類的方法中使用內部類,然後在main中呼叫這個外部類方法
- 直接使用:
外部類名稱.內部類名稱 物件名 = new 外部類名稱(). new 內部類名稱();
如果出現重名情況,格式:
外部類名稱.this.外部成員變數名
區域性內部類定義
修飾符 class 外部類名稱{
修飾符 返回值型別 外部類方法名稱(引數列表){
class 區域性類名稱{
}
}
}
定義一個類的時候,許可權修飾符規則如下:
- 外部類:public / (default)
- 成員內部類:public / protected / (default) / private
- 區域性內部類:什麼都不寫
區域性內部類的final問題
區域性內部類,如果希望訪問所在方法的區域性變數,那麼這個區域性變數必須是【有效final的】。
- new出來的物件在堆(heap)中
- 區域性變數是跟著方法走的,在棧(stack)當中
- 方法執行結束後,立刻出棧,區域性變數立刻消失
- 但是new出來的物件會在堆(heap)中持續存在,直到垃圾回收消失
匿名內部類
如果介面的實現類(或者是父類的子類)只需使用唯一的一次,那麼這種情況下就可以省略掉該類的定義,而改為使用【匿名內部類】。
匿名內部類的定義格式
介面名稱 物件名 = new 介面名稱(){
//覆蓋重寫所有方法
};
對格式“new 介面名稱() {...}”進行解析:
- new代表建立物件的動作
- 介面名稱就是匿名內部類需要實現哪個介面
- {...}是匿名內部類的內容
注意事項:
- 匿名內部類,在【建立物件】的時候,只能使用唯一一次。如果希望多次建立物件,而且類的內容一樣的話,那麼就必須使用單獨定義的實現類了。
- 匿名物件,在【呼叫方法】的時候,只能呼叫唯一一次。如果希望同一個物件,呼叫多次方法,那麼必須給物件起個名字。
- 匿名內部類是省略了【實現類/子類名稱】,但是匿名物件是省略了【物件名稱】
注意:匿名內部類和匿名物件不是一回事!!!