Ссылка на не финальную переменную: почему этот код компилируется?
Прежде всего, я прошу прощения, если это дублирующий вопрос. Я нашел много похожих, но ни одного, которые напрямую касаются моего вопроса.
Готовясь к предстоящему экзамену, я делаю прошлую работу. У него есть вопрос, который дает фрагмент кода. Мы должны указать, компилируется ли он, а если нет, написать строку, в которой происходит первая ошибка компилятора, и объяснить ее. Это фрагмент:
public static void main(String[] args) {
JFrame f = new JFrame("hi");
JTextField jtf = new JTextField(50);
jtf.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent evt) {
jtf.setText(evt.getLocationOnScreen().toString());
}
});
f.add(jtf);
f.setVisible(true);
}
Я ожидал, что это не скомпилировать какjtf
не являетсяfinal
, Я проверил свою теорию, введя приведенный выше код в Eclipse, который помечал ожидаемую ошибку, но компилировался и работал просто отлично. Это было только после наведения мышки наJTextField
что я получил ожидаемую ошибку:
java.lang.Error: Неразрешенная проблема компиляции: Невозможно сослаться на неконечную локальную переменную jtf, определенную в прилагаемой области видимости
Я немного поискал и обнаружил, что Eclipse использует свою собственную версию компилятора Java. Поэтому я переделал файл вне Eclipse и скомпилировал / запустил его через командную строку. Он скомпилирован без ошибок и предупреждений, а при наведении курсора на текстовое поле отображается нужныйjava.awt.Point[x=...,y=...]
.
Мое понимание анонимных внутренних классов состоит в том, что они могут получить доступ к:
Поля вмещающего классаМетоды вмещающего классаЛокальные переменные вмещающей области, если ониfinal
Так чего мне не хватает? Согласно тому, что я знаю, этот кодне должно работать.