解决方案 »

  1.   

    亲 不通过Cannot refer to a non-final variable count inside an inner class defined in a different method final int count = 5;没有诡异的地方
      

  2.   


    好吧 你赢了 我用的myeclipse
    不但编译不通过,而且运行也失败你确定你  执行的class文件不是加了final 的??试试 清空后 重新编译 执行
      

  3.   


    好吧 你赢了 我用的myeclipse
    不但编译不通过,而且运行也失败你确定你  执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??
      

  4.   


    好吧 你赢了 我用的myeclipse
    不但编译不通过,而且运行也失败你确定你  执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??
    1.7.0_67
      

  5.   


    好吧 你赢了 我用的myeclipse
    不但编译不通过,而且运行也失败你确定你  执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??
    1.7.0_67
      

  6.   

    哇噻,这个bug上次在百度知道上也有人提到了,我当时还不相信呢,今天在命令行试了一下,还真是这样的。我用 JDK8 编译正常,换 JDK7 编译就出错了。
    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:\>
      

  7.   

    先看编译器的对比 : 
    JDK8 vs. JDK7.
    第一招:用局部变量,编译器知道推认定它是常量。第二招:用参数,虽然也是final,但这次编译器不知道认定它是变量。第三招,这次告诉大家真相,Java 对此部分并未修改,只是编译器更聪明。当这个变量确实没有修改时它知道加不加 final 都是正常的,当我们在代码中加上了 count = 9;  时编译器 JDK8 知道了这不是常量而是变量。因此可以说 JDK8编译更智能,它能预测你是否打算修改这个变量的值而不是根据你是否忘记了添加 final 修改符。
      

  8.   

    大家别争了,是 eclipse 编译器严格地检查代码,而 JDK 8 编译器更智能,它检测变量是否真地修改了,只要变量值未修改,加不加 final 没有关系,因此 JDK 8 是基本事情的结果做出判断,而JDK7及以前的编译器和 eclipse 都是基于“是否打算修改”而不管“是否真的修改了”。测试结果在楼上。
    好吧 你赢了 我用的myeclipse
    不但编译不通过,而且运行也失败你确定你  执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??
    1.7.0_67
      

  9.   


    好吧 你赢了 我用的myeclipse
    不但编译不通过,而且运行也失败你确定你  执行的class文件不是加了final 的??试试 清空后 重新编译 执行我就用的普通的文本编辑器,直接用JDK编译,话说我怀疑是因为JDK版本的问题,我的是最新版的JDK,你的呢??
    1.7.0_67
    佩服啊 !!!结果很令人信服!!
      

  10.   

    其实编译器JDK8提示的错误消息不同,我们看到其中的“或实际上的最终变量”这个新加的部分就知道了,编译器会推测它是不是真的被修改了。JDK7的编译器就没有“或实际上的最终变量”这个考虑,eclipse 的编译器也没有考虑,不过,或许我们等到 Eclipse Luna 的 Java SE 8 编译器出来后也解决了这个问题了呢。F:\>D:\JavaEnv\J2SE8.X86\bin\javac -d . NoNameInnerClassDemo.java
    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
    佩服啊 !!!结果很令人信服!!