包含实例的匿名类
我正在阅读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
属性始终从上下文继承。