Java 为什么我可以从局部方法内部类访问外部非最终变量

Java 为什么我可以从局部方法内部类访问外部非最终变量,java,Java,当我的朋友运行此代码时。它报告了一个编译错误,说it315必须是最终版本,这和书上说的一样。然而,当我在eclipse中运行它时,它完全没有问题。我可以访问它315,即使它不是最终版本。我只是想知道为什么 public class InOut { String str=new String("between"); public void amethod(final int iArgs){ int it315= 10; class Bicycl

当我的朋友运行此代码时。它报告了一个编译错误,说it315必须是最终版本,这和书上说的一样。然而,当我在eclipse中运行它时,它完全没有问题。我可以访问它315,即使它不是最终版本。我只是想知道为什么

public class InOut {

    String str=new String("between");

    public void amethod(final int iArgs){

        int it315= 10;
        class Bicycle{
            public void sayHello(){
                System.out.println(str);
                System.err.println(iArgs);
                System.out.println(it315);
            }


        }
        Bicycle  cBicycle=new Bicycle();
        cBicycle.sayHello();

    }

    public static void main(String[] args) {
        new InOut ().amethod(999);

    }

}

在Java8中,您可以访问“有效的final”变量(未声明为final,但实际上未修改)。似乎您的朋友正在使用Java 7(或更早版本)编译器,而您的Eclipse安装配置为使用Java 8。

原因是,为了避免在内部类访问该变量时更改该变量的值。 编译器将变量的值复制到内部类变量,这就是原因


至于你的朋友为什么会担心出错,我想,@Tagir-answer是合乎逻辑的,

你的意思是:“当我的朋友编译这段代码时”,是吗?是的。他不能编译这段代码。它报告了无法访问非最终变量的错误。我们在谈论哪个Java版本?