天天看點

關于在方法内部建立匿名内部類使用的局部變量必須加final修飾匿名内部類的分類方法内部建立匿名内部類原理分析

使用匿名内部類

  • 匿名内部類的分類
    • 成員匿名内部類
    • 局部匿名内部類
  • 方法内部建立匿名内部類
  • 原理分析

匿名内部類的分類

成員匿名内部類

局部匿名内部類

方法内部建立匿名内部類

public class Animal{
  public void eat(){
  final double mount;
  new Dog(){
  System.out.println(mount);
}
}
}
           

原理分析

之前不知道為什麼在方法中匿名内部類使用局部變量時會在局部變量前面加上final修飾,後來在一篇部落格上查到了相關資料.

在使用反編譯jd-gui可了解到,當建立匿名内部類時,會将局部變量通過構造方法的方式傳遞給内部類,這是内部完成的,我們是看不到的。而為什麼要用final修飾呢?接下來我們就來一探究竟了。

局部變量可分為基本變量和局部變量,将局部變量指派給内部類的構造器也就是将值copy一份給構造器中的變量

在這裡補充一點:在引用類型指派時,實際上是将引用變量存放的位址copy一份給參數,而基本類型就是直接将值copy一份

這裡就很容易了解了,為什麼在匿名内部類中為什麼要使用final修飾局部變量了。final的深沉次了解就是為了保證資料的一緻性,就是不能再修改了。對于基本變量的意思是不能修改值,引用變量就是不能修改位址。是以對于引用變量來說,如果不用final修飾,也就意味着其儲存的位址可以随時改變,而當你改變儲存的位址的時候,匿名内部類是不知道的,也就意味着局部變量指向一個位址,匿名内部類中的成員變量(在匿名内部類中,會将局部變量變為成員變量,再通過構造方法指派)指向另一個位址,勢必編譯會出錯。是以必須用final修飾

繼續閱讀