Mi pare di aver capito che sono classi senza nome... ma che senso hanno non capisco? Quale sarebbe la loro utilità?
Mi pare di aver capito che sono classi senza nome... ma che senso hanno non capisco? Quale sarebbe la loro utilità?
Le classi anonime sono il caso più particolare che ci sia in Java per la dichiarazione/creazione di una classe.Originariamente inviato da Il Pazzo
Mi pare di aver capito che sono classi senza nome... ma che senso hanno non capisco? Quale sarebbe la loro utilità?
Innanzitutto anonima vuol dire appunto che non ha un nome (in realtà ce l'ha un nome ma è generato internamente in maniera particolare dal compilatore).
Una classe anonima consente di dichiarare e allo stesso tempo istanziare una classe che può essere A) una estensione di una classe oppure B) una classe che implementa una interfaccia. O uno o l'altro caso.
Le classi anonime si usano in genere per creare brevi classi il cui unico scopo è quello di sfruttare il polimorfismo, cioè fare l'override di un qualche metodo presente nella superclasse o nella interfaccia implementata.
Ma si può anche fare la istanziazione direttamente nella chiamata ad un metodo!codice:class Prova { public void stampa () { ....qualcosa.... } } .... Prova p = new Prova () { public void stampa () { ....altro .... } };
Finisco qui (mica posso fare un tutorial lungo come la quaresima ....) con alcune note:
Una classe anonima:
- è implicitamente final
- non può avere variabili o metodi di classe (static).
- non si possono dichiarare esplicitamente dei costruttori, l'unico costruttore è generato dal compilatore.
- per la fase di inizializzazione si possono usare i blocchi di inizializzazione di istanza (che guarda caso erano stati introdotti in Java 1.1 insieme alle inner-class)
Naturalmente non ho detto tutto di tutto sulle classi anonime!
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
uhmm...
interessante :master:
Non ho ben capito... Ma il suo unico scopo è quello di dichiarare e istanziare una classe allo stesso tempo?Originariamente inviato da andbin
Una classe anonima consente di dichiarare e allo stesso tempo istanziare una classe che può essere A) una estensione di una classe oppure B) una classe che implementa una interfaccia. O uno o l'altro caso.
E poi non oh capito bene... ma il tuo esempio era A o B.... o nessuno dei due?
andava letto così:Originariamente inviato da Il Pazzo
Non ho ben capito... Ma il suo unico scopo è quello di dichiarare e istanziare una classe allo stesso tempo?
E poi non oh capito bene... ma il tuo esempio era A o B.... o nessuno dei due?
Una classe anonima consente di dichiarare e allo stesso tempo istanziare una classe che può essere:
A) una estensione di una classe oppure
B) una classe che implementa una interfaccia.
O uno o l'altro caso.
Quindi, ad esempio, nel caso A verrebbe una cosa così:
codice:class Prova { public void stampa () { ....qualcosa.... } } .... Prova p = new Prova () extends Prova2 { public void stampa () { ....altro .... } };
??????????
Non si usa extends o implements per le classi anonime!!!!Originariamente inviato da Il Pazzo
Quindi, ad esempio, nel caso A verrebbe una cosa così:
codice:class Prova { public void stampa () { ....qualcosa.... } } .... Prova p = new Prova () extends Prova2 { public void stampa () { ....altro .... } };
??????????
È già quella sintassi molto "particolare" new ClasseOInterfaccia (...) { corpo classe anonima } a definire la classe anonima. Ed è l'unico caso in cui si può fare new con un nome di interfaccia.
Facendo new Classe() {...} oppure new Interfaccia() { ...} NON si sta creando una istanza di Classe o Interfaccia ma si sta creando una istanza di una classe appunto anonima che estende Classe oppure implementa Interfaccia.
Ecco il perché dell'uno o dell'altro caso in modo esclusivo.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Ah ok... quindi alla fine una classe anonima è un override veloce che potrebbe servre solo sul momento... cioè ho capito bene?
ma nel caso di un interfaccia non dovrei sovrascrivere tutti i metodi dell'interfaccia?
Sì è così. È utile per sfruttare il polimorfismo, facendo l'override dei metodi che servono.Originariamente inviato da Il Pazzo
Ah ok... quindi alla fine una classe anonima è un override veloce che potrebbe servre solo sul momento... cioè ho capito bene?
Se ci pensi un attimo se nella classe anonima definisci dei nuovi metodi (non in override quindi), nessuno dall'esterno potrebbe usarli visto la classe è anonima e la istanza la puoi assegnare solo ad un tipo della classe base o della interfaccia implementata!
Ovviamente, vale lo stesso discorso per la implementazione di una interfaccia in qualunque altra classe.Originariamente inviato da Il Pazzo
ma nel caso di un interfaccia non dovrei sovrascrivere tutti i metodi dell'interfaccia?
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
perfetto grazie... ora è tutto molto più chiaro