oop通过java中内联创建的对象访问私有元素
我是java新手,尝试了一些访问方法,但遇到了一些我不理解的问题。下面的代码工作正常,打印9,没有给出任何编译错误。 我认为这段代码应该给出一个编译错误,测试方法应该无法访问数字,因为new Human()是一个完全不同的类的实例。有人能解释一下这里发生了什么事吗
public class Test{
public static void main(String[] args) {
int number = 9;
test("holla",new Human(){
@Override
void test() {
// TODO Auto-generated method stub
System.out.println(number); // I think this line should not compile
}
});
}
private static void test(String a ,Human h){
h.test();
}
}
人类阶级
public abstract class Human {
abstract void test();
}
# 1 楼答案
在java 8之前您是正确的
局部变量应该是
final
,以便在匿名类中访问从Java8开始,还允许访问内部变量
试一试
现在
number
根本不是有效的final,您会得到一个编译器错误,它说“在封闭范围中定义的局部变量号必须是final或有效的final”您可能需要阅读Difference between final and effectively final
# 2 楼答案
这是完全有效的(对于java8-在此之前,在声明
number
时需要thjefinal
关键字):test()
方法所需的实现李>为了使您的示例“无效”:只需添加一个赋值
在主方法中-在定义匿名内部类之后。或者使用比java8旧的java版本
请记住,匿名内部类是闭包,JVM是从外部复制内部所需的值。但是当外部值发生变化时,应该复制哪个值。进一步阅读见here