Zunächst, ich entschuldige mich, wenn dies eine doppelte Frage ist. Ich habe viele ähnliche gefunden, aber keine, die meine Frage direkt betreffen.Verweis auf nicht endgültige Variable: Warum kompiliert dieser Code?
In Vorbereitung auf eine bevorstehende Prüfung, mache ich eine Vergangenheitsarbeit. Es hat eine Frage, die ein Code-Snippet gibt. Wir müssen angeben, ob es kompiliert wird, und wenn nicht, schreibe die Zeile, bei der der erste Compilerfehler auftritt, und erkläre es. Dies ist der Code-Schnipsel:
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);
}
ich es nicht zu kompilieren erwartet wurde als jtf
nicht final
. Ich testete meine Theorie, indem ich den obigen Code in Eclipse eingab, der den erwarteten Fehler markierte, aber kompilierte und lief gut. Erst nach über die JTextField
mousing, dass ich die erwartete Fehlermeldung anzeigt:
java.lang.Error: Unresolved compilation problem: Cannot refer to the non-final local variable jtf defined in an enclosing scope
ich ein bisschen suchen hat, und entdeckte, dass Eclipse-seine eigene Version des Java-Compiler verwendet. Also habe ich die Datei außerhalb von Eclipse neu erstellt und über die Befehlszeile kompiliert/ausgeführt. Es kompilierte ohne Fehler oder Warnungen, und wenn man über das Textfeld mogelte, zeigte das gewünschte java.awt.Point[x=...,y=...]
an.
Mein Verständnis von anonymen inneren Klassen ist, dass sie zugreifen können:
- Felder der umgebenden Klasse
- Methoden der umschließenden Klasse
- Lokale Variablen des umschließenden Umfang, vorausgesetzt, sie sind
final
Also was fehlt mir? Nach dem, was ich weiß, sollte dieser Code nicht funktionieren.