匿名内部类在访问其原语等时是否始终捕获对“this”(外部)对象的引用?

时间:2011-12-21 01:01:09

标签: java instance-variables anonymous-inner-class

如果我有

[编辑:添加了“内部”的类型定义]

interface Inner{
    public void execute();
}

class Outer{
    int outerInt;
    public void hello(){
        Inner inner = new Inner(){
            public void execute(){
                outerInt=5;
            }
        }

        //later
        inner.execute();
    }
}

inner.execute()的调用会将特定 outerInt对象的Outer变量设置为5,无论它在何处被调用,并且只要Inner对象存在?或者它只会更改outerInt变量的副本而不会影响原始的Outer对象?

4 个答案:

答案 0 :(得分:6)

这将捕获并修改外部this

请参阅spec

答案 1 :(得分:3)

回答你新澄清的问题(从评论到我的其他答案):

即可。
所有内部和本地类都将引用其父级this,即使他们从未使用它 Demo

答案 2 :(得分:0)

这不一定是真的。你没有展示的是Inner的类声明。如果Inner有一个名为outerInt的字段,那么将修改该字段。否则外面的外部会。如果您运行:

public class Outer {

    int outerInt = 0;

    public void hello() {
        Inner inner = new Inner() {
            @Override
            public void execute() {
                outerInt = 5;
            }
        };

        // later
        inner.execute();
        System.out.println(outerInt);
    }

    public static void main(String[] args) {
        Outer o = new Outer();
        o.hello();
    }
}

class Inner {
    int outerInt;

    public void execute() {

    }
}

你会得到0而不是5。

但是通过评论Inner的outerInt,那么你得到5

答案 3 :(得分:0)

是的。但是如果你需要使用外部类的实例,例如传递给某种方法,你必须说Outer.this。