Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: [Java] Classi anonime

  1. #1
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071

    [Java] Classi anonime

    Mi pare di aver capito che sono classi senza nome... ma che senso hanno non capisco? Quale sarebbe la loro utilità?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Classi anonime

    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à?
    Le classi anonime sono il caso più particolare che ci sia in Java per la dichiarazione/creazione di una classe.
    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.

    codice:
    class Prova {
        public void stampa () { ....qualcosa.... }
    }
    
    ....
    
    Prova p = new Prova () {
        public void stampa () { ....altro .... }
    };
    Ma si può anche fare la istanziazione direttamente nella chiamata ad un metodo!

    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente bannato
    Registrato dal
    Jul 2005
    Messaggi
    49
    uhmm...
    interessante :master:

  4. #4
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071

    Re: Re: [Java] Classi anonime

    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.
    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?

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    1,175

    Re: Re: Re: [Java] Classi anonime

    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?
    andava letto così:
    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.

  6. #6
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    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 .... }
    };

    ??????????

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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 .... }
    };

    ??????????
    Non si usa extends o implements per le classi anonime!!!!

    È 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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    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?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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?
    Sì è così. È utile per sfruttare il polimorfismo, facendo l'override dei metodi che servono.
    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!

    Originariamente inviato da Il Pazzo
    ma nel caso di un interfaccia non dovrei sovrascrivere tutti i metodi dell'interfaccia?
    Ovviamente, vale lo stesso discorso per la implementazione di una interfaccia in qualunque altra classe.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    perfetto grazie... ora è tutto molto più chiaro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.