Java學習--內部類

內部類

概念

將一個類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)匿名內部類省略【實現類/子類名稱】,匿名對象省略【對象名稱】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章