匿名内部类使用的局部变量要用final修饰
原因,为了保证数据一致:
- 当局部变量是基本类型:保证变量值一致
- 当局部变量是引用类型:保证变量指向的地址一致
java语法用什么保证一致性
采用复制局部变量的方式:
- 基本类型:复制值
- 引用类型:复制地址
为什么匿名内部类不直接引用局部变量?
如果直接引用,,当外部方法运行结束的时候,退栈,局部变量也就死亡回收变成null,但有可能这个内部类的对象还在,在匿名内部类里就无法访问该变量,就可能发生异常
为什么要使用final
修饰
如果不使用final
修饰,那么外部方法和内部匿名类都可能修改局部变量,从而导致数据不一致。
jdk8中的变动
jdk8中,可以在编码时不使用final
修饰,它在编译底层会加上fianl
,同时,如果在匿名类中修改局部变量或者外部方法在匿名类使用后修改局部变量,编码是会报异常的,会提示你该变量必须是final
修饰的