问题描述
- 匿名内部类怎么获取外部外部局部变量
-
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修正。
时间: 2024-10-25 02:13:49