public class test {
// public String name;
public void say(String name) {
new RunnableWithReturn() {
@Override
public Object execute() {
System.out.println(name);
return null;
}
};
}
}
interface RunnableWithReturn {
public abstract Object execute();
}
// public String name;
public void say(final String name) {
new RunnableWithReturn() {
@Override
public Object execute() {
System.out.println(name);
return null;
}
};
}
添加参数 final
匿名类可以直接访问所在环境的局部变量,也能访问类的成员变量的。只是你的测试代码有问题。
修正下你的测试类:
public class Test {
public String name;
public Test(String name){
this.name = name;
}
public void say() {
String value = "ling";
RunnableWithReturn t= new RunnableWithReturn() {
@Override
public Object execute() {
System.out.println("访问局部变量:"+value);
System.out.println("访问成员变量:"+name);
return null;
}
};
t.execute();
}
public static void main(String[] args) {
new Test("wang").say();
}
}
一楼说的用final是在匿名线程中访问外部环境的局部变量时,需要定义为final类型,因为局部变量在线程中运行时脱离了它的原来创建环境,有可能生存周期超过原来的创建线程,所以java语法规定必须用final修正。
哈哈哈,不错不错,多谢解答,我又找了些大神的解释,差不多了。
==》在java匿名类中我们要去使用外部的局部变量或者参数是,这个被匿名类使用的变量必须是final的
至于为毛就比较复杂了,哈哈哈