Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [JAVA] Classi interne anonime

    Salve,

    In Java è possibile creare delle classi interne , ovvero classi all'interno di altre classi.
    Le classi interne possono essere di due tipi:
    [list=1][*]Complete[*]Anonime[/list=1]
    Vorrei soffermarmi sulle classi interne anonime . Ecco un esempio:

    Codice PHP:
    public class TimeTestWindow extends JFrame{
       ...
       
    hourField.addActionListener(
          new 
    ActionListener(){      // Classe interna aninima
             
    ...
          }
       )

    Domanda : anche se il mio libro le chiama classi interne anonime , non sarebbe più corretto chiamarli oggetti anonimi visto che quello che creo è un oggetto privo di riferimento e non una classe, che per inciso non si può "creare" ma solo dichiarare e successivamente istanziare.

    PS: Il termine istanza e il termine oggetto significano esattamente la stessa cosa?

    Grazie dell'attenzione,
    Matteo
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

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

    Re: [JAVA] Classi interne anonime

    Originariamente inviato da matthew80
    In Java è possibile creare delle classi interne , ovvero classi all'interno di altre classi.
    Sì ma la cosa è più generale, vale anche per interfacce ed enum. Puoi dichiarare una classe dentro una interfaccia, una interfaccia dentro una classe, una enum dentro una interfaccia, ecc....

    Originariamente inviato da matthew80
    Le classi interne possono essere di due tipi:
    [list=1][*]Complete[*]Anonime[/list=1]
    Non so dove hai preso questa "lista" perché è incompleta e comunque non ha senso.

    Esistono 4 tipi di classi "innestate":
    - Nested static class
    - "Regular" inner class
    - Method-local inner class
    - Anonymous inner class

    E solo le ultime 3 sono "inner" (il che ha delle conseguenze e delle proprietà che ora non sto a spiegare, per brevità).

    Originariamente inviato da matthew80
    Domanda : anche se il mio libro le chiama classi interne anonime , non sarebbe più corretto chiamarli oggetti anonimi visto che quello che creo è un oggetto privo di riferimento e non una classe, che per inciso non si può "creare" ma solo dichiarare e successivamente istanziare.
    Non è privo di riferimento!

    La classe anonima è tale perché non ha un nome (in realtà un nome ce l'ha ma è generato dal compilatore ed è in un formato particolare, basta vedere il file .class generato). Non avendo nome a livello di sorgente, una delle conseguenze è che non può avere un costruttore esplicito (anche qui in realtà il costruttore esiste ma è generato in automatico dal compilatore).

    Quello che tu hai a seguito del new di una classe anonima è, nota bene, una istanza di una classe (senza nome) che estende una classe oppure implementa una interfaccia.

    Originariamente inviato da matthew80
    PS: Il termine istanza e il termine oggetto significano esattamente la stessa cosa?
    Un oggetto è una istanza di una classe.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Mi autocorreggo:

    Un oggetto aninimo è un oggetto senza nome.
    Gli oggetti anonimi generalmente vengono usati come argomento di un metodo e, ovviamente, non prevedono una implementazione.

    Es:
    Codice PHP:
    setNome(new String("Matteo")); 
    Una classe anonima interna è una classe a tutti gli effetti solo che non possiede un nome e va implementata. La dichiarazione di una classe anonima, richiede anche l’istanza di un suo oggetto, e l’esistenza di una sua superclasse di cui sfrutterà il costruttore. Infatti se una classe non ha nome non può avere un costruttore.
    Le classi interne anonime generalmente vengono usate (anche per ragioni storiche) nelle GUI per la gestione degli eventi.
    Es:
    Codice PHP:
    hourField.addActionListener
          new 
    ActionListener(){      // Classe interna aninima 
             
    ... 
          } 
       ) 
    La sintassi di una classe interna anonima è particolare e per questo mi ha generato confuzione.

    Cmq siccome voglio imparare Java per realizzare applicazioni web (JSP) dubito che mi troverò mai a che fare con classi interne anonime...o sbaglio?
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da matthew80
    Un oggetto aninimo è un oggetto senza nome.
    Gli oggetti anonimi generalmente vengono usati come argomento di un metodo e, ovviamente, non prevedono una implementazione.
    Ehhh????
    Non ha senso parlare di "oggetto anonimo", un oggetto non è anonimo o non anonimo ... è un oggetto e basta!

    Originariamente inviato da matthew80
    Es:
    Codice PHP:
    setNome(new String("Matteo")); 
    E questa riga cosa c'entra???? NON è una classe anonima ..... è semplicemente la creazione di un oggetto String, passato subito al metodo.

    Originariamente inviato da matthew80
    Infatti se una classe non ha nome non può avere un costruttore.
    Come ho detto non uno esplicito. In realtà il costruttore c'è ed è generato dal compilatore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ciao andbin,

    ci siamo accavallati nella risposta.
    Allora quando ho scritto:
    Le classi interne possono essere di due tipi:
    Complete
    Anonime
    In realtà volevo scrivere
    Le classi possono essere di due tipi:
    Definizioni di classi complete
    Definizioni di classi interne
    Sorry...ma io non copio pari pari quello che dice il libro ma scrivo il post cercando di spiegare quello che ho capito senza vedere

    In realtà però sarebbe meglio se dicessi che le classi possono essere esterne o interne.
    Le classi interne si dividono in: (quella che segue è una lista semplificata fatta da me)
    [list=1][*]Interne alla classe con nome[*]Interne alla classe senza nome (anonime)[*]Interne al metodo con nome[/list=1]
    Le classi interne alla classe hanno accesso ai membri ed ai metodi della classe esterna senza bisogno di riferimenti.
    Le classi interne al metodo con nome hanno accesso ai membri ed ai metodi della classe esterna senza bisogno di riferimenti, ma non alle variabili del metodo in cui sono state definite, a meno che non siano final

    Ma ci sta sempre il dubbio che mi rode...alimentato ancor di più da una tua frase, e cioè:
    Quello che tu hai a seguito del new di una classe anonima è, nota bene, una istanza di una classe (senza nome) che estende una classe oppure implementa una interfaccia.
    [...]
    Un oggetto è una istanza di una classe.
    Quindi: se quello che segue il new è un istanza della classe anonima ed un istanza di classe è un oggetto, allora quello che segue il new è un oggetto anonimo e non una classe anonima.
    Eppure, come ho detto nel post precedente, un oggetto anonimo che, ad esempio, passo come argomento ad un metodo, non ha ovviamente una implementazione, mentre una classe interna anonima che, ad esempio, passo come argomento ad un metodo, ha un'implementazione.

    Alla fine, caro andbin la differenza tra classe interna anonima e oggetto anonimo che passo al metodo l'ho capita...ma non riesco a sopportare di dare nomi a casaccio alle cose! (come fanno spesso molti libri di informatica a seconda di chi li traduce).
    Quindi : E' giusto dire che si tratta di una classe interna o è un oggetto interno?
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  6. #6
    Ci stiamo contuamente accavallando nelle risposte

    Cmq io per oggetto anonimo intendo un oggetto che viene creato ma non referenziato esplicitamente, quindi privo di riferimento.
    Quindi:
    Codice PHP:
    String s = new String("Matteo");
    ...
    setNome(s); 
    posso recuperare l'oggetto new String("Matteo")
    mentre in
    Codice PHP:
    setNome(new String("Matteo")); 
    non posso posso recuperare l'oggetto new String("Matteo") perchè privo di riferimento, per questo oggetto anonimo.
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  7. #7
    Cmq la mia domanda iniziale resta sempre insoluta:
    se quello che segue il new è un istanza della classe anonima ed un istanza di classe è un oggetto, allora quello che segue il new è un oggetto anonimo e non una classe anonima?

    Ci sta qualcosa che nn mi quadra nella definizione.
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da matthew80
    Ciao andbin,

    ci siamo accavallati nella risposta.
    Allora quando ho scritto:
    Le classi interne possono essere di due tipi:
    Complete
    Anonime
    In realtà volevo scrivere
    Le classi possono essere di due tipi:
    Definizioni di classi complete
    Definizioni di classi interne
    In realtà però sarebbe meglio se dicessi che le classi possono essere esterne o interne.
    Le classi interne si dividono in: (quella che segue è una lista semplificata fatta da me)
    [list=1][*]Interne alla classe con nome[*]Interne alla classe senza nome (anonime)[*]Interne al metodo con nome[/list=1]
    Comunque non ha senso parlare di "Definizioni di classi complete". Una classe non è completa o incompleta.

    Le classi in Java sono o "top-level" oppure "nested". E nota bene che nested qui vuol dire semplicemente "dentro" un'altra classe. Perché poi c'è la suddivisione tra "nested static class" e "inner class" che sono 2 cose un po' diverse.

    Originariamente inviato da matthew80
    Le classi interne alla classe hanno accesso ai membri ed ai metodi della classe esterna senza bisogno di riferimenti.
    Sì, quelle inner.

    Originariamente inviato da matthew80
    Le classi interne al metodo con nome hanno accesso ai membri ed ai metodi della classe esterna senza bisogno di riferimenti, ma non alle variabili del metodo in cui sono state definite, a meno che non siano final
    Perfetto.

    Originariamente inviato da matthew80
    Ma ci sta sempre il dubbio che mi rode...alimentato ancor di più da una tua frase, e cioè:

    Quindi: se quello che segue il new è un istanza della classe anonima ed un istanza di classe è un oggetto, allora quello che segue il new è un oggetto anonimo e non una classe anonima.
    Eppure, come ho detto nel post precedente, un oggetto anonimo che, ad esempio, passo come argomento ad un metodo, non ha ovviamente una implementazione, mentre una classe interna anonima che, ad esempio, passo come argomento ad un metodo, ha un'implementazione.
    Alt ... calma.
    Si ha una classe anonima quando dopo il new Nome() segue il corpo { .... }. Questo è il punto chiave.

    Originariamente inviato da matthew80
    Alla fine, caro andbin la differenza tra classe interna anonima e oggetto anonimo che passo al metodo l'ho capita...ma non riesco a sopportare di dare nomi a casaccio alle cose! (come fanno spesso molti libri di informatica a seconda di chi li traduce).
    Prendi in considerazione i nomi in inglese che ho detto all'inizio. Quelli sono corretti e largamente usati.

    Originariamente inviato da matthew80
    Quindi : E' giusto dire che si tratta di una classe interna o è un oggetto interno?
    Continuo a dire che un oggetto non è interno/esterno o anonimo/non anonimo .... è un oggetto è basta. Un oggetto è una istanza di una classe. Punto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Ok...allora il problema (di forma) mi è sorto a causa della mia definizione di oggetto anonimo. Quello che in realtà io chiamo impropriamente oggetto anonimo sarebbe un oggetto privo di riferimento esplicito.
    Quindi nell'esempio:
    Codice PHP:
    setNome(new String("Matteo")); 
    new String("Matteo") è per la precisione un oggetto privo di riferimento esplicito col quale poter essere richiamato.

    Per quanto riguarda la divisione delle classi (escludendo le nested static class che semplicemente non so cosa siano perchè non ci sono ancora arrivato...ma suppongo siano classi nidificate dato il nome) allora abbiamo:
    [list=1][*]top-level class (classi esterne)[*]inner class (classi interne)[/list=1]
    Le inner class (classi interne) a loro volta si dividono in:
    [list=1][*]Regular inner class (Interne alla classe con nome)[*]Anonymous inner class (Interne alla classe senza nome)[*]Method-local inner class (Interne al metodo con nome)[/list=1]

    Una classe interna è tale se prevede, oltre alla dichiarazione, anche l'implementazione, altrimenti sarebbe un oggetto privo di riferimento esplicito (quello che io chiamavo oggetto anonimo ).

    E' corretto così?

    PS: In effetti non dovendo progettare GUI difficilmente mi troverò dinanzi a delle anonymous inner class o method-local inner class, vero?
    Discorso diverso, invece, per le Regular inner class che potrebbero in effetti servirmi per realizzare oggetti che siano visibili solo alla classe (per esempio mi creo una classe interna con nome di tipo privato per realizzare gli oggetti che contengono ogni elemento che si trova attualmente in una coda).

    E' tutto corretto wiki?
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da matthew80
    E' corretto così?
    Diciamo di sì. (sennò mi viene mal di testa a continuare).

    Originariamente inviato da matthew80
    PS: In effetti non dovendo progettare GUI difficilmente mi troverò dinanzi a delle anonymous inner class o method-local inner class, vero?
    Discorso diverso, invece, per le Regular inner class che potrebbero in effetti servirmi per realizzare oggetti che siano visibili solo alla classe (per esempio mi creo una classe interna con nome di tipo privato per realizzare gli oggetti che contengono ogni elemento che si trova attualmente in una coda).
    Esatto, il tuo ultimo esempio poi è proprio calzante. In una classe che gestisce ad esempio una lista linkata, è abbastanza tipico definire il "nodo" come una classe innestata (static o non static ... a seconda del "design") privata.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.