匿名 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 无关紧要。
我还有一个关于匿名 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 无关紧要。