Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Classi in java

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    22

    Classi in java

    Ciao a tutti, sono da tempo registrato a questo forum, ma è la prima volta che entro diciamo nella sezione java; sto studiando da poco questo linguaggio ed ho un dubbio sulle classi:
    non riesco bene a capire la differenza diciamo operativa tra classi annidate e classi derivate, nelle prime se io ho una classe e dentro ad essa ne dichiaro un'altra, quest'ultima puo accedere alle variabili della prima no? però non le possiede giusto? Cosa che invece dovrebbe accadere in caso di derivazione dico bene? Non capisco in definitiva quando mi conviene usare classi annidate e quando quelle derivate.
    Spero di essere stato chiaro, ciao ciao =)

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

    Re: Classi in java

    Originariamente inviato da redo86
    tra classi annidate e classi derivate
    Una classe derivata è una classe che estende un'altra classe ovvero c'è una relazione in termini di ereditarietà:

    class B extends A { ... }

    La classe B estende A e quindi B è-un A, tutto ciò che fa A lo fa anche B, magari con qualcosa in più o di diverso rispetto ad A.

    Una classe "annidata" (o "innestata") è semplicemente una classe dichiarata dentro un'altra classe. Non necessariamente c'è un legame in termini di ereditarietà, tecnicamente è possibile che la classe innestata estenda la classe contenitore ma non è questo il punto ....

    Originariamente inviato da redo86
    nelle prime se io ho una classe e dentro ad essa ne dichiaro un'altra, quest'ultima puo accedere alle variabili della prima no?
    Dipende dal tipo di classe "annidata".
    Esistono 4 tipi di classi annidate:

    - nested (static) class
    - inner class ("regular")
    - local inner class
    - anonymous inner class

    Ognuna ha le sue regole (che ti conviene approfondire). La prima è un tipo a parte, è una classe innestata dichiarata static e si chiama "nested". Le altre 3 sono tutte "inner" e sono un'altra cosa ben diversa da una "nested" class.

    Originariamente inviato da redo86
    Non capisco in definitiva quando mi conviene usare classi annidate e quando quelle derivate.
    Le inner class furono introdotte, se ben ricordo, in Java 1.1 insieme alla nuova gestione degli eventi con i "listener". Un caso tipico di uso di una inner class è proprio per dichiarare una classe interna per la gestione degli eventi.

    La estensione invece serve per altro. Pensa ad una classe Persona e a una classe Studente. Viene logico pensare che uno studente è una persona, quindi qui ha senso solo la ereditarietà, cioè Studente extends Persona. Non ha alcun senso che Studente sia semplicemente dichiarato dentro Persona.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    22
    ok capito non avevo afferratoXD se io ora volessi fare ad esempio una classe persona e una classe studenti derivata del tipo:

    class persona{String nome,cognome;/* ...*/}
    class studente extends persona{int matricola; /*..*/}

    e volessi creare una lista generale cosi da aggiungere quanti studenti/persone voglia, come devo fare?
    una lista semplice so farla:

    class lista{
    class elem{int inf;
    elem pun; }
    elem padre;
    /*...*/
    }

    Ma quando entrano in gioco classi derivate etc vado in confusione, come dovrebbe essere la struttura di una lista in questo caso?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da redo86
    class persona{String nome,cognome;/* ...*/}
    class studente extends persona{int matricola; /*..*/}
    Molto molto abbozzata ma ok, concettualmente.

    Originariamente inviato da redo86
    e volessi creare una lista generale cosi da aggiungere quanti studenti/persone voglia, come devo fare?
    Ma devi implementare tu la gestione di una lista??? Perché se non devi farlo per questioni "didattiche" (studio, compito assegnato, esame, ecc...) fai molto prima ad usare le collezioni già presenti nel framework di Java.

    E se invece ti è stato proprio chiesto esplicitamente di implementare tu una "lista", allora innanzitutto devi scegliere se farla basata su "array" o su "lista linkata" (singola o doppia)

    Originariamente inviato da redo86
    Ma quando entrano in gioco classi derivate etc vado in confusione, come dovrebbe essere la struttura di una lista in questo caso?
    Detto nel modo più ampio possibile, una lista generalmente è fatta per gestire 1 tipo di dato. E chiaramente accetta di poter contenere qualunque tipo che sia assegnabile a quel tipo.
    Se implementi una lista che gestisce espressamente oggetti Persona e che quindi ha, facciamo l'esempio, dei metodi:

    public void add(Persona p) {...}
    public Persona get(int index) {...}

    La tua lista accetta oggetti di tipo Persona ma anche oggetti Studente (se supponiamo che Studente estende Persona). In generale accetta qualunque oggetto che è-una Persona!!
    Ma questo alla lista non dovrebbe minimamente interessare. Nel senso che se gli oggetti contenuti sono di tipi diversi es. uno Persona, un altro Studente, un altro Professore (che estende Persona), per la lista è del tutto indifferente.

    Potrebbe invece non essere indifferente per te che poi, da qualche parte, userai la lista. Ad un certo punto dovrai pure estrarre (nel senso di leggere ... non eliminare) gli elementi dalla lista. A te potrebbe solo interessare che siano oggetti Persona (ed è quello che ti fornisce il get() che ho ipotizzato prima). Ma se hai bisogno di sapere il tipo preciso, si può anche fare un test a runtime.
    Insomma ... il problema non è la lista ma dove poi la usi e in quale contesto.


    P.S. Prima di cimentarti nella realizzazione di una tua lista, documentati sulle collezioni già presenti nel framework.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    22
    ah scusa non avevo specificato, comunque si è a scopo didattico, sto preparando un esame per l'universita, quindi volevo fare questa cosa per capire meglio il funzionamente delle classi derivate :P, comunque se ho capito quindi gli oggetti che deve avere la lista sono gli oggetti persona no?:

    class elem{
    persona pers;
    elem pun;
    }

    Ma per quanto prima detto: le classi derivate, ad esempio studenti, non possiedono (generalmente) grazie alla derivazione, piu membri della superclasse, persona in questo caso?
    Nel caso studenti quindi: nome,cognome e matricola mentre nel caso persona: nome e cognome.
    Non ho quindi poi problemi nel modificare il campo matricola?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da redo86
    comunque se ho capito quindi gli oggetti che deve avere la lista sono gli oggetti persona no?
    Nel tuo caso immagino di sì ... è la classe base. Dipende, chiaramente, da cosa devi fare ... ma se hai definito una gerarchia di tipi e vuoi gestirla attraverso una tua lista, è chiaro che ha senso usare Persona (nota: ti suggerisco di seguire le convenzioni standard sui nomi ... P maiuscola) ... altrimenti che ti serve?

    Originariamente inviato da redo86
    le classi derivate, ad esempio studenti, non possiedono (generalmente) grazie alla derivazione, piu membri della superclasse, persona in questo caso?
    Non è che "devono". Possono avere più membri (a livello di campi e di metodi). Cosa abbia in più la classe Studente rispetto a Persona ... lo stabilisci tu.

    Originariamente inviato da redo86
    Nel caso studenti quindi: nome,cognome e matricola mentre nel caso persona: nome e cognome.
    Non ho quindi poi problemi nel modificare il campo matricola?
    In che senso?? La classe Persona ha le proprietà nome e cognome, quindi ha i metodi getter (e anche setter se necessario) getNome()/getCognome(). La classe Studente ha in più la proprietà matricola, quindi ha solamente il metodo getMatricola() (pure il setter se necessario). Ma il resto lo "eredita" (gli altri metodi intendo ... i campi dovrebbero essere private).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    22
    Originariamente inviato da andbin
    In che senso?? La classe Persona ha le proprietà nome e cognome, quindi ha i metodi getter (e anche setter se necessario) getNome()/getCognome(). La classe Studente ha in più la proprietà matricola, quindi ha solamente il metodo getMatricola() (pure il setter se necessario). Ma il resto lo "eredita" (gli altri metodi intendo ... i campi dovrebbero essere private).
    sisi infatti, ma se l'oggetto della lista è persona, come faccio poi a modificare il campo matricola? è questo che non capisco; detto in parole povere (nel caso semplice):

    class Universita{
    private elem{Persona pers; elem pun;}
    /*Metodi aggiunta persone/studenti*/}

    class Persona{protected String nome,cognome; /*Metodi etc*/}
    class Studente extends Persona{protected int matricola; /*metodi etc*/}

    poi nel main:
    {
    Universita un;
    un.CreateStudent(/*...*/);
    /*...*/
    }

    cosi facendo però come posso modificare matricola visto che è posseduto da studenti e in elem c'è un oggetto Persona?Non so se riesco a spiegarmi.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da redo86
    cosi facendo però come posso modificare matricola visto che è posseduto da studenti e in elem c'è un oggetto Persona?
    Per la tua "collezione" dovrebbe essere del tutto ininfluente!!!
    Se ha un metodo:

    public Persona get(int indice) { ... }

    Quando usi la collezione sei tu che devi sapere cosa ci può essere:

    Caso 1: Sai a priori che la tua collezione contiene solo oggetti Studente (perché dove hai fatto gli inserimenti hai inserito solo oggetti Studente):

    codice:
    Studente s = (Studente) tuaCollezione.getPersona(123);
    Fai un cast. Lo sai tu che contiene solo Studenti, quindi il cast è valido fintanto che tiene quanto ho appena detto: contiene solo oggetti Studente.


    Caso 2: Sai a priori che la tua collezione può contenere oggetti Persona o suoi sottotipi (es. Studente).
    In questo caso ... dipende da cosa poi devi farci. Vuoi fare qualcosa di specifico? Devi fare un cast come sopra ma .... non subito!! Devi prima testare il tipo:

    codice:
    Persona p = tuaCollezione.getPersona(123);
    
    if (p instanceof Studente) {   // è davvero un Studente???
        Studente s = (Studente) p;
       .....
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    22
    ah quindi alla fine è tutto un problema di cast? ecco cosa non mi quadrava, ho capito, provo a vedere se riesco a tirare fuori qualcosa di buono=) grazie mille...

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.