Java中方法内定义的内部类可以访问方法中的局部变量的问题 局部变量javaclass 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 亲 不通过Cannot refer to a non-final variable count inside an inner class defined in a different method final int count = 5;没有诡异的地方 好吧 你赢了 我用的myeclipse不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行 好吧 你赢了 我用的myeclipse不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢?? 好吧 你赢了 我用的myeclipse不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??1.7.0_67 好吧 你赢了 我用的myeclipse不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??1.7.0_67 哇噻,这个bug上次在百度知道上也有人提到了,我当时还不相信呢,今天在命令行试了一下,还真是这样的。我用 JDK8 编译正常,换 JDK7 编译就出错了。F:\>D:\JavaEnv\J2SE8.X86\bin\javac -d F:\ NoNameInnerClassDemo.javaF:\>D:\JavaEnv\J2SE7.X86\bin\javac -d F:\ NoNameInnerClassDemo.javaNoNameInnerClassDemo.java:11: 错误: 从内部类中访问本地变量count; 需要被声明为最终类型 System.out.println("test:"+count); ^1 个错误F:\> 先看编译器的对比 : JDK8 vs. JDK7.第一招:用局部变量,编译器知道推认定它是常量。第二招:用参数,虽然也是final,但这次编译器不知道认定它是变量。第三招,这次告诉大家真相,Java 对此部分并未修改,只是编译器更聪明。当这个变量确实没有修改时它知道加不加 final 都是正常的,当我们在代码中加上了 count = 9; 时编译器 JDK8 知道了这不是常量而是变量。因此可以说 JDK8编译更智能,它能预测你是否打算修改这个变量的值而不是根据你是否忘记了添加 final 修改符。 大家别争了,是 eclipse 编译器严格地检查代码,而 JDK 8 编译器更智能,它检测变量是否真地修改了,只要变量值未修改,加不加 final 没有关系,因此 JDK 8 是基本事情的结果做出判断,而JDK7及以前的编译器和 eclipse 都是基于“是否打算修改”而不管“是否真的修改了”。测试结果在楼上。好吧 你赢了 我用的myeclipse不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??1.7.0_67 好吧 你赢了 我用的myeclipse不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??1.7.0_67佩服啊 !!!结果很令人信服!! 其实编译器JDK8提示的错误消息不同,我们看到其中的“或实际上的最终变量”这个新加的部分就知道了,编译器会推测它是不是真的被修改了。JDK7的编译器就没有“或实际上的最终变量”这个考虑,eclipse 的编译器也没有考虑,不过,或许我们等到 Eclipse Luna 的 Java SE 8 编译器出来后也解决了这个问题了呢。F:\>D:\JavaEnv\J2SE8.X86\bin\javac -d . NoNameInnerClassDemo.javaNoNameInnerClassDemo.java:11: 错误: 从内部类引用的本地变量必须是最终变量或实际上的最终变量 System.out.println("test:"+ count); ^1 个错误F:\>cd cmpF:\Cmp>D:\JavaEnv\J2SE7.X86\bin\javac -d . NoNameInnerClassDemo.javaF:\Cmp>D:\JavaEnv\J2SE7.X86\bin\javac -d . NoNameInnerClassDemo.javaNoNameInnerClassDemo.java:11: 错误: 从内部类中访问本地变量count; 需要被声明为最终类型 System.out.println("test:"+ count); ^1 个错误好吧 你赢了 我用的myeclipse不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??1.7.0_67佩服啊 !!!结果很令人信服!! 定义对象问题 认为掌握了java char的进来 求一个用JAVA写的Telnet程序!急用!谢谢! 新手JAVA的问题 动物信息问题 提几个c++ 与 java 的概念区别问题 [求助]POI如何处理超级链接 请问如何扰乱java代码,使别人反编译时难读 急求jndi的解答 有看过《java core》那本书的朋友进来帮我一下,小弟先谢过了。 运行服务器端出现java.net.BindException: Address in use: bind 这是什么错误? 菜鸟求助,关于java的插入排序的算法。 手机保险箱里的图片怎么在电脑上打开
好吧 你赢了 我用的myeclipse
不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行
好吧 你赢了 我用的myeclipse
不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??
好吧 你赢了 我用的myeclipse
不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??
1.7.0_67
好吧 你赢了 我用的myeclipse
不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??
1.7.0_67
F:\>D:\JavaEnv\J2SE8.X86\bin\javac -d F:\ NoNameInnerClassDemo.javaF:\>D:\JavaEnv\J2SE7.X86\bin\javac -d F:\ NoNameInnerClassDemo.java
NoNameInnerClassDemo.java:11: 错误: 从内部类中访问本地变量count; 需要被声明为最终类型
System.out.println("test:"+count);
^
1 个错误F:\>
JDK8 vs. JDK7.
第一招:用局部变量,编译器知道推认定它是常量。第二招:用参数,虽然也是final,但这次编译器不知道认定它是变量。第三招,这次告诉大家真相,Java 对此部分并未修改,只是编译器更聪明。当这个变量确实没有修改时它知道加不加 final 都是正常的,当我们在代码中加上了 count = 9; 时编译器 JDK8 知道了这不是常量而是变量。因此可以说 JDK8编译更智能,它能预测你是否打算修改这个变量的值而不是根据你是否忘记了添加 final 修改符。
好吧 你赢了 我用的myeclipse
不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??
1.7.0_67
好吧 你赢了 我用的myeclipse
不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??
1.7.0_67
佩服啊 !!!结果很令人信服!!
NoNameInnerClassDemo.java:11: 错误: 从内部类引用的本地变量必须是最终变量或实际上的最终变量
System.out.println("test:"+ count);
^
1 个错误F:\>cd cmpF:\Cmp>D:\JavaEnv\J2SE7.X86\bin\javac -d . NoNameInnerClassDemo.javaF:\Cmp>D:\JavaEnv\J2SE7.X86\bin\javac -d . NoNameInnerClassDemo.java
NoNameInnerClassDemo.java:11: 错误: 从内部类中访问本地变量count; 需要被声明为最终类型
System.out.println("test:"+ count);
^
1 个错误好吧 你赢了 我用的myeclipse
不但编译不通过,而且运行也失败你确定你 执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??
1.7.0_67
佩服啊 !!!结果很令人信服!!