包含实例的匿名类

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

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

有人能给我一个代码的例子,并解释它到底做了什么? 我知道,如果InnerClass是其成员OuterClass它的外围实例是OuterClass ,但在annonymous类方面,它有些陌生。


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() ,从而从这个封闭的实例中访问一个方法。


效果与非匿名内部类相同。 实质上,这意味着:

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属性始终从上下文继承。

链接地址: http://www.djcxy.com/p/91985.html

上一篇: Anonymous classes enclosing instances

下一篇: Why are all anonymous classes implicitly final?