我有一个匿名课的最后一个问题。
在匿名类中,访问定义匿名类的类的属性和方法。
访问定义匿名类的方法的局部变量,前提是它们是最终的。这是因为方法完成后局部变量将不再存在。
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
在上面的例子(我没有得到任何错误和结果)........我可以访问所有变量和方法???但是为什么它说只有最终和子类中的定义,变量将不再存在而没有最终。
我假设您使用的是Java 8或更高版本。在Java 8及更高版本中,匿名类可以访问“有效最终”的局部变量,即它们没有明确声明为final
,但它们从未被赋值,因此它们有资格被声明为final
。局部变量j
实际上是最终的,因为它在初始化后从未被赋值,因此假设这是Java 8+,您可以在匿名类中使用它。变量i
是一个实例变量,因此可以通过A.this
隐式访问它,因此i
是否为final是无关紧要的。