Mi intrometto un attimo: attenzione non scrivi mai
perchè altrimenti ti da errore in compilazione.codice:WindowAdapter wa = new WindowAdapter();
Scrivi invece:
codice:WindowAdapter wa = new WindowAdapter(){ //override dei vari eventi }
ah ecco, quindi potrebbe eesere questa la differenza. Scritto nel secondo modo WA non è istanziato, bensì vengono solo overridati i metodi/eventi.
E' così che va interpretato?
Quello che ti ha postato borras, cioè sostanzialmente:
è una "anonymous inner class". La classe istanziata non è infatti WindowAdapter ma è una classe "anonima" che in generale può solo:codice:WindowAdapter wa = new WindowAdapter() { // qui i metodi };
- estendere 1 classe.
oppure (in alternativa, non insieme!)
- implementare 1 interfaccia (estendendo implicitamente Object).
Nel caso sopra, viene creata una classe "anonima" che estende WindowAdapter. La classe si dice anonima perché il vero nome della classe lo sceglie/compone il compilatore e tu il nome non lo sai/hai nel codice sorgente.
P.S. è vero che il nome non lo sai (cioè non è evidente) ma si conosce quale è la convenzione usata dal compilatore.
Ultima modifica di andbin; 16-10-2013 a 13:59
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
Non ho capito cosa intendi, forse c'è qualcosa che non ci trova d'accordo con le terminologie
Se scrivi
di fatto stai istanziando l'oggetto.codice:Oggetto og = new blablablabla;
I metodi di WA non sono definiti abstract altrimenti avremmo dovuto necessariamente implementarli al momento della
.codice:new WindowAdapter()
Riassumendo, se non fai override dei metodi allora vengono utilizzati i metodi della classe astratta WA (ripeto, i metodi non sono astratti) che "fanno niente".
Ah! E da cosa lo capisco che è anonima?è una "anonymous inner class".
Ad esempio una'istanziazione del genere non è anonima, e qui ci siamo
Nel caso del codice new WindowAdapter() {Impiegato rossi = new Impiegato ("Mario" , "Rossi" , 1974, "Capo reparto");
// qui i metodi
};è anonima perchè è seguita dalle parentesi graffe all'intenro delle quali viene effettuato l'override dei metodi della WA?
Cmq faccio notare che il codice originale è WindowListener wa = new WindowAdapter()
Niente me ne andavo per un'intuizione, che quindi si è rivelata sbagliata
quindi sia se scrivo WindowAdapter wa = new WindowAdapter();
che
WindowAdapter wa = new WindowAdapter(){
//override dei vari eventi
}
si tratta di un'istanzazione
Quindi questo ci porta alla domanda, perchè -stando a quello che hai detto tu- il primo codice porta ad un errore di compilazione mentre il secondo no?
Te lo ha spiegato qui andbin...
SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
Di questo libro e degli altri (blog personale di recensioni libri) | NO M.P. TECNICI
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
ah ok, adesso tutto torna quindi. Se invece si fosse istanziata la classe senza le parentesi graffe etc etc, ci sarebbe stato appunto un errore per via della natra abstract della classe WA
Ad ogni l'ultima domanda è: in questo caso si è istanziata una inner class anonima, è possibile istanziarne una non-anonima invece?