2 lxl110801311 lxl110801311 于 2016.03.07 17:38 提问

匿名内部类怎么获取外部外部局部变量

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();

}

3个回答

Jim80
Jim80   2016.03.07 17:47
已采纳

// public String name;
public void say(final String name) {
new RunnableWithReturn() {
@Override
public Object execute() {
System.out.println(name);
return null;
}
};
}

添加参数 final
wojiushiwo945you
wojiushiwo945you 可以直接访问局部变量的,不知你测试了没有。
接近 2 年之前 回复
wojiushiwo945you
wojiushiwo945you final是在匿名线程中访问外部环境的局部变量时,需要定义为final类型,因为局部变量在线程中运行时脱离了它的原来创建环境,有可能生存周期超过原来的创建线程,所以java语法规定必须用final修正。
接近 2 年之前 回复
wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.07 18:44

匿名类可以直接访问所在环境的局部变量,也能访问类的成员变量的。只是你的测试代码有问题。
修正下你的测试类:

 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修正。

lxl110801311
lxl110801311   2016.06.15 15:47

哈哈哈,不错不错,多谢解答,我又找了些大神的解释,差不多了。

总结final变量的赋值问题

匿名类中的final

==》在java匿名类中我们要去使用外部的局部变量或者参数是,这个被匿名类使用的变量必须是final的

至于为毛就比较复杂了,哈哈哈

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!