Board logo

標題: 內部類別 [打印本頁]

作者: tonyh    時間: 2015-10-3 15:54     標題: 內部類別

本帖最後由 tonyh 於 2015-10-3 16:20 編輯

一、定義

內部類別(InnerClass)是在JAVA中常見的使用方法。顧名思義,就是有個Class包在另一個Class裡面。

JAVA中的類別依所存在位置分成兩種:
1. 一般類別
2. 內部類別

其中內部類別同樣依所存在的位置又有三種狀態:

[attach]1423[/attach]

二、內部類別的使用權限

[attach]1425[/attach]

1.成員式 Member inner class
   所有 field/method 均可自由使用

2.區域式 Local inner class
   所有 field/method 均可自由使用
   Local variables 必須標記為final才可以使用 [備註]
   如果Local和Field有同名變數時,預設會選用距離inner class最近的階層,也就是Local的變數
   如果想要使用Field變數,就需要使用到<className>.this.<fieldName>來選用該field

3.匿名式 Anonymous inner class
   與Local inner class一樣
   (其實Anonymous inner class與Local inner class的性質是一樣的)

三、從外部使用內部類別的方法

1.使用成員式Member inner class的方法
   一般Member Classes: new <ClassName>().new <InnerClassName>();
   意思就是必須先取得<ClassName>的實體,再用其new來取得<InnerClassName>實體
   Static Classes: new <ClassName>.<StaticInnerClassName>();
   由於Static類別隨時可以取得,因此直接指名取得實體即可

2.使用區域式Local inner class的方法
   無直接取用方法,僅可能透過所屬method回傳,限制很多,用途也不大,幾乎不這樣使用。

[備註] 為什麼必須標記為final才可以使用?

Local inner class所在的Method回傳值(return)後,Method中的變數將會被銷毀,因此在Method中,被Local inner class所用到的變數會被複製一份來使用,此時,如果該變數不是final,則複製的變數就可能因為更改而不同步,造成錯亂,因此Local inner class所用到的local variables必須標記為final。

另外,匿名式Anonymous inner class所用到的local variables也必須須標記為final,雖然規定都一樣,但是原因並不同。這裡是因為AIC在實體化時,會將使用到的local variables直接複製並且生成為自己的private變數,同樣的,出現拷貝時,就會有同步的問題,因此該變數也必須被標記為final。




歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://istak.org.tw/seed/) Powered by Discuz! 7.2