Всем добрый день, стало интересно, как работает доступ к локальным переменным из анонимного класса. Допустим у меня такой код
public void addListener() {
String s = "Hello World";
this.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.out.println(s);
}
});
}
И пусть этот метод будет определён в классе унаследованном от JButton. Вот мы при нажатии на эту кнопку
всегда будет видеть сообщение Hello World! Но мне интересно, как он будет ссылаться на этот Hello World!. Есть предположение, что у него есть некая невидимая ссылка на тот же на объект, что ссылается s т.е. на Hello World!, но я
не уверен в своём предположении, так что прошу у вас ответа на данный вопрос, спасибо.
Ответ
Все просто, анонимные классы компилируются в отдельные классы с названием <название родительского класса>$<индекс>.class. Если посмотреть на его содержимое, в частности, для примера который был в вопросе, то увидим следующее:
class ru.izebit.Main$1 implements java.awt.event.ActionListener {
final java.lang.String val$s;
final ru.izebit.Main this$0;
ru.izebit.Main$1(ru.izebit.Main, java.lang.String);
public void actionPerformed(java.awt.event.ActionEvent);
}
ru.izebit.Main - это название класса, в котором я объявил анонимный класс.
val$s - ссылка на строковую переменную со значением "Hello World"
this$0 - ссылка на объект класса, в котором был объявлен анонимный класс, т.к. из анонимного класса есть возможность получать доступ к полям объекта, а это происходит именно через эту переменную
Комментариев нет:
Отправить комментарий