Прежде всего, я прошу прощения, если это дублирующий вопрос. Я нашел много подобных, но никто из них напрямую не затрагивает мой вопрос.
В рамках подготовки к предстоящему экзамену я делаю прошлую работу. У него есть вопрос, который дает фрагмент кода. Мы должны указать, если он компилируется, а если нет, напишите строку, в которой возникает первая ошибка компилятора, и объясните ее. Это фрагмент:
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, который помечен ожидаемой ошибкой, но скомпилирован и работает нормально. Только после mousing над JTextField
я получил ожидаемую ошибку:
java.lang.Error: проблема неразрешенной компиляции: Нельзя ссылаться на не конечную локальную переменную jtf, определенную в охватывающей области
Я немного искал и обнаружил, что Eclipse использует собственную версию компилятора Java. Поэтому я переделал файл вне Eclipse и скомпилировал/выполнил его через командную строку. Он скомпилирован без ошибок или предупреждений, а когда мышь над текстовым полем, отобразите желаемый java.awt.Point[x=...,y=...]
.
Мое понимание анонимных внутренних классов заключается в том, что они могут получить доступ:
- Поля охватывающего класса
- Методы охватывающего класса
- Локальные переменные охватывающей области, если они
final
Так что мне не хватает? Согласно тому, что я знаю, этот код не должен работать.