Java анонимный класс и достижимая приватная переменная - PullRequest
5 голосов
/ 31 октября 2011
interface Test {
public void test();
}

public class TestMain {
private String h = "AAA";

public static void main(String[] args) {
    TestMain t = new TestMain();
}

public TestMain() {
    Test t = new Test() {
        public void test()  {
            System.out.println( h );
        }
    };

    t.test();
}

}

Приведенный выше источник работает хорошо.

Но я думаю, что переменная 'h' должна быть недоступна из анонимного класса. Мне нужно знать, почему это работает хорошо.

Спасибо за всю вашу помощь заранее!

Ответы [ 3 ]

7 голосов
/ 31 октября 2011

Каждый экземпляр нестатического внутреннего класса имеет включающий экземпляр - экземпляр внешнего класса, к которому он привязан через ссылочную переменную, хранящуюся во внутреннем объекте класса.Все члены включающего экземпляра доступны для внутреннего объекта класса через эту ссылку.

Компилятор, конечно же, заботится о добавлении этой ссылочной переменной, а также некоторых специальных функций доступа, которые внутренний объект класса может использовать для доступа к закрытым членам внешнего объекта класса.Вы можете увидеть эти функции доступа, разобрав внешний класс с помощью javap -c.

1 голос
/ 31 октября 2011

Основное правило для определения доступности для закрытых членов, согласно разделу 6.6.1 Спецификации языка Java :

[I] Если член или конструктор объявлен закрытым, то доступ разрешается, если и только если он происходит в теле класса верхнего уровня, который содержит объявление члена или конструктора.

0 голосов
/ 31 октября 2011

Вложенный класс является членом включающего его класса.Нестатические вложенные классы (внутренние классы) имеют доступ к другим членам включающего класса, даже если они объявлены закрытыми.Статические вложенные классы не имеют доступа к другим членам включающего класса.

...