一個類的內部包含另外一個類,那麼這種狀況就叫內部類。this
內部類與外部類的關係,就像人體與心臟,汽車與發動機的關係。對象
內部類分爲:成員內部類和局部內部類(包含匿名內部類)。接口
定義格式:內存
修飾符 class 外部類名稱 {
修飾符 class 內部類名稱 {class
//...}變量
//...}權限
注意:內部類訪問外部類,能夠隨意訪問,但外部類訪問內部類,須要內部類的對象。方法
內部類的使用:命名
1).間接方式:在外部類的方法中使用內部類,而後經過main方法僅調用外部類的方法。new
2).直接方式:調用格式以下:
外部類名稱.內部類名稱 對象名 = new 外部類名稱.new 內部類名稱();
在內部類中的訪問外部類同名變量的訪問格式:
外部類名稱.this.外部類的成員變量
定義格式:
修飾符 class 外部類名稱{
修飾符 返回值類型 外部類方法名稱(參數列表){
class 局部內部類名稱{方法體
}
}
方法體
}
局部性體如今:只能在該方法中內使用,出了方法就不能使用了。
定義一個類的時候,權限修飾符的規則:
外部類:public/(default)
成員內部類:public/protected/(default)/private
局部內部類:什麼都不能寫。
局部內部類的final問題:
對局部內部類,若是但願訪問所在方法的局部變量,那麼這個局部變量必須是有效final的。
注意:從Java8開始,只要局部變量事實不變,那麼final關鍵字能夠省略不寫。
緣由以下:
1).new出來的對象是存放在堆內存當中的。
2).局部變量是跟着方法走的,存放在棧內存當中。
3).方法運行結束後,馬上出棧,局部變量會馬上消失。
4).可是此時new出來的對象會在堆當中持續存在,直到回收消失。
局部內部類中的匿名內部類:
若是接口的實現類或者父類的子類只須要使用一次,那麼這種狀況下,就能夠省略掉該類的定義,而改成使用匿名內部類。
匿名內部類的定義格式:
接口名 對象名 = new 接口名稱 (){ // 覆蓋重寫全部的·抽象方法}
匿名內部類的注意事項:
對格式「new 接口名稱 (){ // 覆蓋重寫全部的·抽象方法}」進行解析:
1).new表明建立對象的動做。
2).接口名稱就是匿名內部類須要實現的哪一個接口。
3)."{......}"中的纔是匿名內部類的內容。
注意事項:
1).匿名內部類在建立對象時,只能使用惟一一次。若是但願屢次建立對象,並且類的內容同樣,那麼就須要單獨定義實現類。
2).匿名對象在調用方法時,只能調用惟一的一次,若是但願同一個對象屢次調用方法,那麼必須給該對象命名。
3).匿名內部類時省略了實現類/子類名稱,可是匿名對象是省略了對象名稱。
強調:匿名對象和匿名內部類不是同一回事。