包含实例的匿名类

ash*_*hur 4 java

我正在阅读Joshua Blochs的"Effective Java"第2版.目前我在第22项描述了内部和嵌套类,但我无法理解这句话的意思:

当且仅当它们出现在非静态上下文中时,匿名类才会封闭实例.

有人能给我一个代码示例并解释它究竟做了什么吗?我知道如果它InnerClassOuterClass其封闭实例的成员OuterClass,但就匿名类而言,这对我来说听起来很奇怪.

JB *_*zet 8

public static void main(String[] args) {
    Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.println("hello world");
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

这里,从静态上下文创建匿名类实例.所以它没有任何封闭的实例.

public class Foo {
    public void bar() {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world");
            }
        };
    }

    private void baz() {
    }
}
Run Code Online (Sandbox Code Playgroud)

这里,从实例方法创建匿名类实例.所以它有一个封闭的实例.该run()方法可以调用baz()Foo.this.baz()从此封闭实例访问方法.


Wal*_*inz 5

效果与非匿名内部类相同。从本质上讲,它的意思是:

class Outer {
   void bar() {
      System.out.println("seems you called bar()");
   }

   void foo() {
     (new Runnable() {
       void run() {
         Outer.this.bar(); // this is valid
       }
     }).run();
   }

   static void sfoo() {
     (new Runnable() {
       void run() {
         Outer.this.bar(); // this is *not* valid
       }
     }).run();
   }
}
Run Code Online (Sandbox Code Playgroud)

因为您不能static为匿名类提供修饰符,所以该static属性始终从上下文继承。