Ссылка на не финальную переменную: почему этот код компилируется?

Прежде всего, я прошу прощения, если это дублирующий вопрос. Я нашел много похожих, но ни одного, которые напрямую касаются моего вопроса.

Готовясь к предстоящему экзамену, я делаю прошлую работу. У него есть вопрос, который дает фрагмент кода. Мы должны указать, компилируется ли он, а если нет, написать строку, в которой происходит первая ошибка компилятора, и объяснить ее. Это фрагмент:

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

Так чего мне не хватает? Согласно тому, что я знаю, этот кодне должно работать.

Ответы на вопрос(4)

Ваш ответ на вопрос