Prima di tutto, mi scuso se si tratta di una domanda doppia. Ne ho trovati molti simili, ma nessuno che riguardasse direttamente la mia domanda.Riferimento alla variabile non finale: perché questo codice viene compilato?
In preparazione per un esame imminente, sto facendo un passato. Ha una domanda che fornisce uno snippet di codice. Dobbiamo specificare se compila e, in caso contrario, scrivere la riga in cui si verifica il primo errore del compilatore e spiegarlo. Questo è il frammento:
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);
}
mi aspettavo di non compilare come jtf
non è final
. Ho testato la mia teoria inserendo il codice sopra in Eclipse, che ha contrassegnato l'errore previsto, ma compilato e eseguito bene. Fu solo dopo il mouse sopra JTextField
che ho avuto l'errore previsto:
java.lang.Error: Unresolved compilation problem: Cannot refer to the non-final local variable jtf defined in an enclosing scope
ho fatto un po 'di ricerca, e ha scoperto che Eclipse utilizza una propria versione del compilatore Java. Così ho rifatto il file all'esterno di Eclipse e lo ho compilato/eseguito tramite la riga di comando. Compilato senza errori o avvisi, e quando si passava il mouse sul campo di testo, visualizzava lo java.awt.Point[x=...,y=...]
desiderato.
mia comprensione di classi interne anonime è che possono accedere a:
- Campi di classe contenitrice
- I metodi della classe racchiude
- variabili locali del campo di applicazione che racchiude, a condizione che siano
final
Quindi cosa mi manca? Secondo quanto noto, questo codice non dovrebbe funzionare.