內部類
概念
將一個類A定義在另一個類B裏面,裏面的那個類A就稱爲內部類,B則稱爲外部類。
成員內部類
定義在類中方法外的類。
定義
class 外部類 {
class 內部類{ }
}
使用
1)間接使用,在外部類的方法中使用內部類,main方法只是使用外部類方法
2)直接使用
外部類名.內部類名 對象名 = new 外部類型().new 內部類型()
重名問題
注意
1)內部類使用外部類隨意使用
2)外部類使用內部類必須使用內部類對象
3)內部類仍然是一個獨立的類,在編譯之後會內部類會被編譯成獨立的.class文件,但是前面冠以外部類的類名 和$符號 。
局部內部類
定義
如果一個類定義在方法內部,該類即爲局部內部類
修飾符 class 外部類名稱{
修飾符 返回值類型 外部類方法名稱(參數列表){
class 局部內部類名稱{
//...
}
}
}
使用
final
局部內部類,如果希望訪問所在方法的局部變量,那麼這個局部變量必須是【有效final的】
備註:從Java 8+開始,只要局部變量事實不變,那麼final關鍵字可以省略
原因:
1)new出來的對象存在堆內存中
2)局部變量跟着方法,在棧內存中
3)方法運行結束之後,立即出棧,局部變量會立即小時
4)new出的對象會在堆中持續存在,直到垃圾回收消失
匿名內部類
內部類的簡化寫法
本質是一個 帶具體實現的 父類或者父接口的 匿名的子類對象。
前提
繼承一個父類或者實現一個父接口
定義
new 父類名或者接口名(){
// 方法重寫
@Override
public void method() { // 執行語句 }
1)new代表創建對象的動作
2)接口名稱就是匿名內部類需要實現那個接口
3){…}纔是匿名內部類的內容
使用
以接口爲例:
接口:
public abstract class FlyAble{
public abstract void fly();
}
創建匿名內部類並調用
public class InnerDemo {
public static void main(String[] args) {
/*
1.等號右邊:是匿名內部類,定義並創建該接口的子類對象
2.等號左邊:是多態賦值,接口類型引用指向子類對象
*/
FlyAble f = new FlyAble(){
public void fly() {
System.out.println("我飛了~~~");
}
};
//調用 fly方法,執行重寫後的方法
f.fly();
}
}
注意事項
1)匿名內部類在創建對象時,只能使用唯一一次
如果希望多次創建對象,而且類的內容一樣的話,必須使用單獨定義的實現類
2)匿名對象,在調用方法的時候,只能調用唯一的一次
如果希望同一個對象,調用多次方法,必須藉助多態給對象起一個名字
3)匿名內部類省略【實現類/子類名稱】,匿名對象省略【對象名稱】