匿名 class 决赛?

final for anonymous class?

我还有一个关于匿名 class 的最终问题。

在匿名 class 中,访问定义匿名 class 的 class 的属性和方法。

访问定义了匿名 class 的方法的局部变量,前提是它们是最终的。这是因为方法结束时局部变量将不再存在。

package a;

public class A {

private int i = 4;

public void meth() {
    System.out.println("will not use");
}

public void meth2() {
    int j = 4;
    final int k = 3;

    A a = new A() {
        public void meth() {
            System.out.println("i-4 is " + (i - 4));   
            System.out.println("j-4 is " + (j - 4));   
            System.out.println("k-4 is " + (k - 4));  
        }
    };
    a.meth();

}

public static void main(String st[]) {
    A a = new A();
    a.meth2();
  }
}

结果如下: 运行: i-4 为 0 j-4 为 0 k-4是-1

在上面的例子中(我没有得到任何错误和结果) .......我可以访问所有变量和方法???但是为什么它说只能final并且子class中的定义,没有final变量将不再存在。

我假设您使用的是 Java 8 或更高版本。在 Java 8 及更高版本中,匿名 classes 可以访问 "effectively final" 的局部变量,即它们未显式声明 final,但从未分配给它们,因此它们有资格被宣布 final。局部变量 j 实际上是最终的,因为它在初始化后从未被赋值,所以假设这是 Java 8+,你可以在匿名 class 中使用它。变量 i 是一个实例变量,因此可以通过 A.this 隐式访问,因此 i 是否为 final 无关紧要。