我正在阅读Joshua Blochs" Effective Java"第2版。目前我在第22项描述了内部和嵌套类,但我无法理解这句话的含义:
当且仅当它们出现时,匿名类才会封闭实例 在非静态环境中。
有人可以给我一个代码示例并解释它究竟是做什么的吗?我知道如果InnerClass
是OuterClass
的成员,其封闭的实例是OuterClass
,但就匿名类而言,这听起来很奇怪。
答案 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
属性始终从上下文继承。