天天看点

关于在方法内部创建匿名内部类使用的局部变量必须加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修饰

继续阅读