關於內部類別
#內部類別是嵌套類別(nested class)的一種,nested class 共有四種:【來源】
static nested class 靜態巢狀類別,接近普通類,沒有指向外部類別的引用;只能存取外部類別的靜態**,可定義非靜態方法,內部類別有靜態**則該類別一定是靜態的;
inner class 內部類別(非靜態) ,真正內部類別;
local class 本機類別(定義在方法內部) 、真正內部類別;
anonymous class 匿名類別、真正內部類,較適合僅使用一次且所實作方法不多的類別;
真正的內部類別可以直接存取外面的封裝類別的實例變數和方法【來源】
1、內部類別和她的外部類別可以互相存取屬性、方法(即使private)(JAVA8)
1)、在8之前,匿名內部類別使用局部變數的生命週期與內部類別物件的生命週期不一致
2)、內部類別的成員變量,作用域停留在方法內,當方法執行結束、局部變數隨之消失,但是引用他的內部可能存在,當內部類別再次呼叫時竟然要存取一個不存在的變數!
3)、所以 jdk8之前必須使用final。反編譯後看出,內部類別實際上也會產生一個有建構方法的類別,引用的變數作為參數傳遞了進來,包括外部類別實例(這也是為什麼內部類別預設會持有外部物件的引用,容易造成記憶體洩漏),然後賦值給了自己的變量,也就是說如果在內部類別裡面改變外部變數的值,實際上改變的只是內部類別自己的變數值,並非外在變數的值,就像方法傳變數過來一樣,無法在方法裡面改變他的值導致外在變數改變,方法裡面的變數都是局部的。所以為了防止這種不一致出現,必須為final。 【來源】
4)、而Java8引入一個effectively final的概念,當內部類別存取外部類別變數時,只要內部類別不對外部變數重新賦值,那麼外部類別變數就是事實上的final變量,Java會隱含地將外部變數宣告為final。 【源】
5)、為什麼是final,上面些許道出了原因,為了篇幅、咳~精益求精,再細復一下:變數是final時,透過將final局部變數「複製」一份作為局部內部類別的資料成員,當局部內部類別存取局部變數時,真正存取的是這個局部變數的“複製品”,當運行堆疊中真正的局部變數死亡時,內部類別物件仍可以存取局部變數(的複製品,似乎局部變數生命期延長了),目前為止和final還沒有太大的關係,O(∩_∩)O哈哈~打著「final」的名義、終歸要迴歸final,變數是final: 【來源】
1、引用類型:其引用值不變(永遠指向同一物件),複製品與原始引用變數相同一樣滴【來源】
2、基本資料類型:變數是final時,因為其值不變,其複製品與原始的量是一樣的,語意效果相同
【來源】
## 內部類別:【來源】 體現邏輯上的從屬關係,對於其他類別可控制內部類別對外不可見 外部類別的成員變數作用域是整個外部類別(包括內部類別,但外部類別無法存取內部類別private成員) 編譯後,內部類別被編譯為單獨的類別,outClass$innerClass的形式static: 靜態初始器:靜態區塊:一個存在類別方法外面的靜態區塊,僅在類別裝載時執行一次,常用初始化靜態類別屬性。 1、靜態方法不能被非靜態方法覆蓋;2、構造方法不容忍宣告為staticfinal:終態特性 1、不能基礎、被被子類別重寫、標記的變數即為常數 2、在宣告時賦值,如沒有、那隻有一次賦值的機會且只能再建構方法中顯式賦值異常: 在通常情況下,不要在finally區塊中使用如return或throw等導致方法終止的語句,否則會導致try區塊、catch區塊中的return、throw語句失效,finally中的return語句會使異常遺失 。 【源】【源】try…catch中,如果出現多個catch,那麼父類別的異常應該放在子類別異常的下面,否則編譯失敗。這個沒有懶得測試了,路過的同仁可以提一些意見^_^
為什麼內部類和異常往往寫一塊吶,看來要總結一下異常了,陷入了九連環、不過別擔心下一篇這篇已經太不單例
相關文章:
相關影片:
內部類別分類及成員內部類別的直接使用-JAVA 初級入門影片教學
以上是【java基礎】關於內部類別及其特性的簡單介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!