1. 程式人生 > 其它 >【Java筆記】java內部類

【Java筆記】java內部類

Java內部類

如果一個事物內部包含另一個事務,那麼這就是一個類內部包含另一個類
例如:身體和心臟的關係,汽車和發動機的關係

分類

  1. 成員內部類
  2. 區域性內部類(包含匿名內部類)

成員內部類的定義格式

修飾符 class 外部類名稱{
	修飾符 class 內部類名稱{
	
	}
}

注意:內用外,隨意訪問;外用內,需要內部類物件;

成員內部類的使用方法

  1. 間接使用:在外部類的方法中使用內部類,然後在main中呼叫這個外部類方法
  2. 直接使用:
    外部類名稱.內部類名稱 物件名 = new 外部類名稱(). new 內部類名稱();

如果出現重名情況,格式:
外部類名稱.this.外部成員變數名

區域性內部類定義

修飾符 class 外部類名稱{
	修飾符 返回值型別 外部類方法名稱(引數列表){
		class 區域性類名稱{
		
		}
	}
}

定義一個類的時候,許可權修飾符規則如下:

  1. 外部類:public / (default)
  2. 成員內部類:public / protected / (default) / private
  3. 區域性內部類:什麼都不寫

區域性內部類的final問題

區域性內部類,如果希望訪問所在方法的區域性變數,那麼這個區域性變數必須是【有效final的】。

  1. new出來的物件在堆(heap)中
  2. 區域性變數是跟著方法走的,在棧(stack)當中
  3. 方法執行結束後,立刻出棧,區域性變數立刻消失
  4. 但是new出來的物件會在堆(heap)中持續存在,直到垃圾回收消失

匿名內部類

如果介面的實現類(或者是父類的子類)只需使用唯一的一次,那麼這種情況下就可以省略掉該類的定義,而改為使用【匿名內部類】。

匿名內部類的定義格式

介面名稱 物件名 = new 介面名稱(){
	//覆蓋重寫所有方法
};

對格式“new 介面名稱() {...}”進行解析:

  1. new代表建立物件的動作
  2. 介面名稱就是匿名內部類需要實現哪個介面
  3. {...}是匿名內部類的內容

注意事項:

  1. 匿名內部類,在【建立物件】的時候,只能使用唯一一次。如果希望多次建立物件,而且類的內容一樣的話,那麼就必須使用單獨定義的實現類了。
  2. 匿名物件,在【呼叫方法】的時候,只能呼叫唯一一次。如果希望同一個物件,呼叫多次方法,那麼必須給物件起個名字。
  3. 匿名內部類是省略了【實現類/子類名稱】,但是匿名物件是省略了【物件名稱】
    注意:匿名內部類和匿名物件不是一回事!!!