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

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个回答

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

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

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

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

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

总结final变量的赋值问题

匿名类中的final

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐