鱼C论坛

 找回密码
 立即注册
查看: 3765|回复: 4

[已解决]关于内部类访问方法的局部变量加不加final的问题

[复制链接]
发表于 2018-8-4 14:34:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在使用Java局部内部类或者匿名内部类时,若该类调用了所在方法的局部变量,则该局部变量必须使用final关键字来修饰,否则将会出现编译错误“Cannot refer to a non-final variable * inside an inner class defined in a different method” 下面通过一段代码来演示和分析原因。
  1. public class Example {  
  2.   
  3.     public static void main(String args[]) {  
  4.         doSomething();  
  5.     }  
  6.   
  7.     private static void doSomething() {  
  8.         final String str1 = "Hello";  
  9.         // String str2 = "World!";  
  10.         // 创建一个方法里的局部内部类  
  11.         class Test {  
  12.             public void out() {  
  13.                 System.out.println(str1);  
  14.                 // System.out.println(str2);  
  15.             }  
  16.         }  
  17.         Test test = new Test();  
  18.         test.out();  
  19.   
  20.     }  
  21.   
  22. }
复制代码

我用的是jdk10.1,是否去掉那两句注释,程序都能正常输出,为什么呢?
最佳答案
2018-8-20 18:31:12
jdk8优化了,智能判断变量的值是不是真的改了,只要没有修改,final去掉也可以。如果你放开第9行,在第9行后再加一行,修改一下str2的值,14行就会报错:"Local variable str2 defined in an enclosing scope must be final or effectively final"。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-8-5 08:43:20 | 显示全部楼层
本帖最后由 Ez疯 于 2018-8-5 15:46 编辑

首先,匿名内部类中,用到外部的定义的局部成员变量的话,是需要使用final的,意思是将其定义为一个 特殊的常量,这样做的原因是,jvm的垃圾回收机制,是会不定时回收清理内存垃圾,如果不这样定义,在内部类调用过程中,这个成员变量要是被回收,那就over了,所以,编译不会通过,这这样做是语法定义.  但是你说的那个str2是会正常执行的,这是为什么呢? 因为String 类型的 对象是默认final 的 ,是不可以被继承的,既然已经默认了,那它就再不用加final了,直接被匿名内部类调用.........
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 11:55:31 | 显示全部楼层
本帖最后由 springrs 于 2018-8-20 11:59 编辑

final加在变量之前表示常量
加在类之前表示的是 最终类
直接使用""定义的字符串会自动在 字符串常量池当中取值,可以看作是常量
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 18:31:12 | 显示全部楼层    本楼为最佳答案   
jdk8优化了,智能判断变量的值是不是真的改了,只要没有修改,final去掉也可以。如果你放开第9行,在第9行后再加一行,修改一下str2的值,14行就会报错:"Local variable str2 defined in an enclosing scope must be final or effectively final"。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 21:54:54 | 显示全部楼层
淡蓝色的花 发表于 2018-8-20 18:31
jdk8优化了,智能判断变量的值是不是真的改了,只要没有修改,final去掉也可以。如果你放开第9行,在第9行 ...

谢谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-14 00:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表