Анонимные внутренние классы имеют закрытый (по умолчанию) доступ к пакету. В Java 6 они являются окончательными, если они объявлены в статическом контексте, но не являются окончательными в других контекстах. (Я верю, но не проверял, что это изменилось в Java 7, так что они всегда являются окончательными; см. Раздел 15.9.5 Спецификации языка Java .)
Например, этот класс имеет четыре анонимных внутренних класса:
public class InnerTest {
public Runnable foo1 = new Runnable() {
public void run() {foo1();}
void foo1() {}
};
private Runnable foo2 = new Runnable() {
public void run() {foo2();}
void foo2() {}
};
public static Runnable foo3 = new Runnable() {
public void run() {foo3();}
void foo3() {}
};
private static Runnable foo4 = new Runnable() {
public void run() {foo4();}
void foo4() {}
};
}
При компиляции с javac (версия 1.6.0_26) генерирует четыре анонимных внутренних класса. Декомпиляция с javap -c
показывает:
InnerTest$1
(foo1
) & mdash; пакет приватный
InnerTest$2
(foo2
) & mdash; пакет приватный
InnerTest$3
(foo3
) & mdash; пакет приватный и финальный
InnerTest$4
(foo4
) & mdash; пакет приватный и финальный
Обратите внимание, что доступ к переменной, которой назначается экземпляр анонимного внутреннего класса, не имеет значения.