В этом коде путаница в отношении "внутреннего класса" и "анонимного класса".
Обратите внимание, что у вас есть 3 класса:
Child
Hello
Hello$1
: анонимный класс, объявленный внутри Hello
и родительский элемент которого Child
Путаница в коде связана с последним:
Hello$1
является подклассом Child
Hello$1
является внутренним классом Hello
Это означает:
Hello$1
не может получить доступ к закрытым полям из Child
, поскольку подклассы не могут получить доступ к закрытым элементам своих суперклассов Hello$1
могут получить доступ к закрытым полям из Hello
, как анонимный внутренний классы могут получить доступ к закрытым элементам своих включающих классов
Проверьте это более четко в этом коде:
class Child {
private int a = 50;
}
public class Hello {
private int b = 60;
public void f()
{
Child c = new Child() {
public void f() {
// System.out.println("a = " + a); // This won't compile
System.out.println("b = " + b); // This compiles OK
}
};
}
}