包含实例的匿名类

时间:2014-06-21 12:31:16

标签: java

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

  

当且仅当它们出现时,匿名类才会封闭实例   在非静态环境中。

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

2 个答案:

答案 0 :(得分:8)

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

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

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

    private void baz() {
    }
}

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

答案 1 :(得分:4)

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

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

因为您无法将static修饰符赋予匿名类,所以static属性始终从上下文继承。