Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在内部类中使用非最终局部变量_Java_Class - Fatal编程技术网

Java 在内部类中使用非最终局部变量

Java 在内部类中使用非最终局部变量,java,class,Java,Class,给出了关于变量的规则,这些变量不是在内部类中声明的,而是在类中使用的 使用的任何局部变量、形式参数或异常参数 未在内部类中声明的必须声明为final或 实际上是最终的(§4.12.4),或者在 尝试使用 例如: class A{ void baz(){ int i = 0; class Bar{ int j = i; } } public static void main(String[] args){ } } 为什么要编译代

给出了关于变量的规则,这些变量不是在内部类中声明的,而是在类中使用的

使用的任何局部变量、形式参数或异常参数 未在内部类中声明的必须声明为final或 实际上是最终的(§4.12.4),或者在 尝试使用

例如:

class A{
    void baz(){
        int i = 0;
        class Bar{ int j = i; }
    }

    public static void main(String[] args){
    }
}


为什么要编译代码?我们在内部类中使用了非最终局部变量,该类中没有声明

i
实际上是最终版本,因为它从未被修改过。正如您自己引用的JLS一样,内部类可以有效地使用最终变量。

因为
i
是有效的最终变量,因为它在
baz
中没有更改,所以在方法baz中定义的变量
i
是有效的最终变量,因为变量i的值在其他地方没有修改。如果你改变它

void baz(){
        int i = 0;
        i = 2;
        class Bar{ int j = i; }
    }
代码将无法编译,因为变量
i
不再是有效的final,但如果您只是声明变量i并在另一行中初始化它,代码将编译,因为变量是有效的final

  void baz(){
        int i;
        i = 2;
        class Bar{ int j = i; }
    }