コンテキストが静的である場合、匿名クラスは静的です。たとえば、静的メソッドで。
非静的コンテキストが存在する場合、非静的にする必要があるかどうかに関係なく、匿名クラスは非静的です。非静的コンテキストが使用されていない場合、コンパイラはクラスを静的にするほど賢くありません。
この例では、2 つの匿名クラスが作成されました。静的メソッドの 1 つは外部クラスへの参照を持たず、静的なネストされたクラスのようなものです。
注: これらのクラスは引き続き「内部」と呼ばれ、外部クラスへの参照がなくても静的メンバーを持つことはできません。
import java.util.Arrays;
public class Main {
Object o = new Object() {
{
Object m = Main.this; // o has a reference to an outer class.
}
};
static Object O = new Object() {
// no reference to Main.this;
// doesn't compile if you use Math.this
};
public void nonStaticMethod() {
Object o = new Object() {
{
Object m = Main.this; // o has a reference to an outer class.
}
};
printFields("Anonymous class in nonStaticMethod", o);
}
public static void staticMethod() {
Object o = new Object() {
// no reference to Main.this;
// doesn't compile if you use Math.this
};
printFields("Anonymous class in staticMethod", o);
}
private static void printFields(String s, Object o) {
System.out.println(s + " has fields " + Arrays.toString(o.getClass().getDeclaredFields()));
}
public static void main(String... ignored) {
printFields("Non static field ", new Main().o);
printFields("static field ", Main.O);
new Main().nonStaticMethod();
Main.staticMethod();
}
}
版画
Non static field has fields [final Main Main$1.this$0]
static field has fields []
Anonymous class in nonStaticMethod has fields [final Main Main$3.this$0]
Anonymous class in staticMethod has fields []