具有内部类的方法内的最终变量

时间:2017-07-22 12:17:50

标签: java variables inner-classes final

让我们看一下下面的代码(让A成为同一个包中的一个简单类):

public class MyClass {
    public void outer() {
        int i=3;
        int j=i++;   // 1
        A a = new A() {
            int k = i++;   // 2
        };
    }
}

虽然行1编译没有问题,但行2会生成以下编译错误:

  

在封闭范围内定义的局部变量必须是final或   有效地

final分配给变量i会导致行1和行2中的编译错误(这是合理的,因为您无法更改最终变量)。

2行编译错误背后的原因是什么?

这也发生在下一个代码块中:

public class MyClass {
    public void outer() {
        A[] arr = new A[10];
        for (int i=0 ; i<10 ; i++) {
            arr[i] = new A() {
                private int j = i; // 1
            };
        }
    }
}

在行1中导致相同的编译错误。但是,如果代码中有以下更改(在标记的行12处),则不会出现编译错误:

public class MyClass {
    public void outer() {
        A[] arr = new A[10];
        for (int i=0 ; i<10 ; i++) {
            final int k = i; // 1
            arr[i] = new A() {
                private int j = k;  // 2
            };
        }
    }
}

我试图了解这个编译选择背后的原因,但我无法理解它们到底是什么。我猜这与方法对变量的可能改变有关,但我不确定我是否完全理解。

0 个答案:

没有答案