局部內部類引用外部類中的局部變數必須是final屬性的!

來源:互聯網
上載者:User

如例中所示,聲明了一個局部內部類TimerPrint,這個類中的方法引用了一個局部變數testTxt,必須聲明為final!!why?

邏輯上:因為該內部類出現在一個方法的內部,但實際編譯時間,內部類編譯為Outer$1TimerPrint.class,這說明,外部類的這個方法和內部類是處於同一層級的。換句話說是兩者的生命週期不一樣!start被調用後,非final變數也會隨之消失,就會出現內部類引用非法!但是範圍範圍相關(該內部類的範圍就在該方法體內)。

實際做法:java編譯器的行為是這樣的(前提條件是該變數在內部類中被引用): 

若定義為final,則java編譯器則會在內部類TimerPrint內產生一個外部變數的拷貝,而且可以既可以保證內部類可以引用外部屬性,又能保證值的唯一性

若不定義為final,則無法通過編譯!(jdk1.6測試過)。因為編譯器不會給非final變數進行拷貝,那麼內部類引用的變數就是非法的!

外部類編譯後的位元組碼: 

內部類編譯後的位元組碼: 

如果外部類中的變數d沒有被內部類引用,則final為可選的,而且java編譯器將不做特殊處理!!

編譯後的外部類class: 
 

編譯後的內部類class: 

REFERENCES:http://blog.csdn.net/whuslei/article/details/6251020

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.