Ritorno del costruttore

di il
8 risposte

Ritorno del costruttore

Ho avuto una discussione con un proff. sul metodo costruttore e volevo avere delle conferme. Alcune cose sono sicuro.
La storia e' questa e non ho capito molto bene cosa intendesse lui come ritorno ma sosteneva che il costrutte ha bisogno di un ritorno, ma dal punto di vista del codice il costruttore non ne ha bisogno invatti non c'e' nulla nella dichiarazione del metodo e tantomento un'istruzione return qualcosa. Poi lui sosteneva che un costruttore restituisce l'oggetto, ma io ho risposto che il costruttore non restituisce afatto l'oggetto, ma semplicemente l'indirizzo, e a questo punto ha detto che l'indirizzo l'indirizzo e' tipicizzato e che e' l'oggetto, ma io ho sostenuto che l'indirizzo di per se non e' tipicizzato e' solo una serie di bit che individua l'allocazione dell'oggetto creato, e il tipo e' un legame creato dal linguaggio. Prima che continuo in questa direzione magari sbagliando completamente qualcuno mi puo dare maggiori informazioni?? Premetto che i costruttori li so usare anche se non ancora perfettamente.
Vi ringrazio in anticipo.

8 Risposte

  • Re: Ritorno del costruttore

    Ciao Lysz210,

    Lysz210 ha scritto:


    Poi lui sosteneva che un costruttore restituisce l'oggetto, ma io ho risposto che il costruttore non restituisce afatto l'oggetto, ma semplicemente l'indirizzo
    Qui devi essere più preciso, il costruttore non restituisce niente, è l' operatore 'new' che restituisce l' indirizzo. Quando crei un oggetto ad esempio a = new MyClass(10, 10), l' operatore 'new' prima alloca lo spazio per contenere l' oggetto, poi richiama il costruttore per inizializzare questa zona di memoria, al costruttore viene passato il puntatore alla memoria, il famoso 'this, quando il costruttore ha finito il controllo ritorna alla 'new' che ritorna il puntatore.

    Lysz210 ha scritto:


    a questo punto ha detto che l'indirizzo l'indirizzo e' tipicizzato e che e' l'oggetto, ma io ho sostenuto che l'indirizzo di per se non e' tipicizzato e' solo una serie di bit che individua l'allocazione dell'oggetto creato, e il tipo e' un legame creato dal linguaggio
    Quando scrivi a = new MyClass(10) la variabile 'a' è un puntatore all' oggetto (in Java tutti gli oggetti sono riferiti tramite puntatore) quindi dire che 'a' è l' oggetto è impreciso. Se fai:
    
    MyClass a = new MyClass();
    MyClass b = a;
    
    Non hai due oggetti distinti, ma due puntatori allo stesso oggetto, infatti se modifichi i campi di 'a' le stesse modifiche vengono viste anche da 'b'.

    Le variabili 'a' e 'b' sono tipizzate (nel senso che il loro tipo è noto al compilatore).

    Lysz210 ha scritto:


    il tipo e' un legame creato dal linguaggio
    Il tipo è anche nascosto nell' oggetto, ricordati che esiste anche la RTTI Run Time Type Identification, e se per caso hai perso le informazioni sul tipo ed hai un puntatore a Object puoi risalire al tipo originale, ad esempio puoi scrivere:
    
    if (p instanceof MyClass)
    	((MyClass)p).MyMethod(); 
    
    Questo perché nella zona dove è allocato l' oggetto esiste un puntatore alla VMT (tabella dei metodi virtuali) e questa tabella e legata al tipo dell' oggetto. Quindi da un puntatore senza tipo si può risalire al tipo.
    Spero di esserti stato utile
  • Re: Ritorno del costruttore

    Grazie, allora avevo capito bene, pero' l'ultima parte non sono riuscito a capire bene.
    instanceof cos'e'? non vedo el parentesi () quindi teoricamente non e' un metodo, e visto che ha 2 parametri mi da piu' l'impressione di un operatore tip ==, per caso chede se l'object p e' un oggetto di MyClasse?
    e visto che e' il test( in questo caso ) di una if faccio il casting di p e poi ne uso il metodo(), e' corretta la mia interpretazione dell'istruzione?
    E se faccio cosi' e' valido?
    
    if( p istanceof MyClass )
    {
       MyClass temp = ( MyClass ) p;   // asegno a temp  p
       p = temp;    // se il mio ragionamento di prima e' giusto ora dovrei aver recuperato il tipo di p
    }
    
    questo in futuro potrebbe tornarmi utile per programmi piu' ampi, e mi farebbe molto piacere avere maggiori informazioni, diventerebbe un bel metodo per costruire una eccezione con le relative correzioni.
    Grezie per la spiegazione e aspetto la correzione di questo posto, intanto ti offro una bella
  • Re: Ritorno del costruttore

    Dimenticavo, hai detto che il tipo e' nascosto nell'oggetto quindi da li si puo fare un controllo, mentre l'indirizzo?? Io ho affermato contro il prof. che l'indirizzo e' semplicemente un numero e di per se e' privo di tipicizzazione questa affermazione e' corretta?
    ti offro un'altra birra
  • Re: Ritorno del costruttore

    Lysz210 ha scritto:


    instanceof cos'e'? non vedo el parentesi () quindi teoricamente non e' un metodo, e visto che ha 2 parametri mi da piu' l'impressione di un operatore tip ==
    Esatto IstanceOf è un operatore binario, quindi vuole un termine a destra e uno a sinistra (un po come l' operatore +).

    Lysz210 ha scritto:


    per caso chede se l'object p e' un oggetto di MyClasse?
    e visto che e' il test( in questo caso ) di una if faccio il casting di p e poi ne uso il metodo(), e' corretta la mia interpretazione dell'istruzione?
    Corretto.

    Lysz210 ha scritto:


    mi farebbe molto piacere avere maggiori informazioni
    Cerca sotto la voce RTTI e Reflection, troverai anche getClass(), getInterfaces(), getSuperclass() ed altre cose interessanti.

    Lysz210 ha scritto:


    dimenticavo, hai detto che il tipo e' nascosto nell'oggetto quindi da li si puo fare un controllo, mentre l'indirizzo?? Io ho affermato contro il prof. che l'indirizzo e' semplicemente un numero e di per se e' privo di tipicizzazione questa affermazione e' corretta?
    Detto così mi sembra sbagliato, ma qui dobbiamo capirci meglio sui termini, cosa intendi con 'indirizzo'? In questo codice:
    
    MyClass a = new MyClass(10);
    
    C' è una variablie 'a' che è tipizzata e che contiene l' indirizzo di in oggetto. Tu cosa affermi esattamente?
  • Re: Ritorno del costruttore

    Grazie per i consigli .
    Detto così mi sembra sbagliato, ma qui dobbiamo capirci meglio sui termini, cosa intendi con 'indirizzo'? In questo codice:

    Codice: Seleziona tutto
    MyClass a = new MyClass(10);


    C' è una variablie 'a' che è tipizzata e che contiene l' indirizzo di in oggetto. Tu cosa affermi esattamente?
    In questo caso per me a e' una variabile che viene contrasegnato in qualche modo da java per contenere l'indirizzo di un oggetto del tipo della dichiarazione in questo caso MyClass, mentre l'operatore new costruisce un oggetto del tipo MyClass restituendo il suo indirizzo in memoria, anche dentro questo indirizzo e' presente un segnalino per indicare il tipo o e' semplicemente un indirizzo numerico?? Pero riflettendoci meglio dal fatto che la variabile a mantiene al suo interno il tipo anche l'indizzo passata da new potrebbe averlo anche se non proprio necessario ma molto utile per verificare immediatamente. E qui ho un po di confusione.
    Pero in realta' questa e' una cosa che va oltre le competenze di un programmatore che usa java e non un suo sviluppatore, io posso anche lavorare tranquillamente senza queste conoscienze importante e' che rispetto le regole imposte. Pero' se riesci a chiarirmi questo piccolo dubbio mi farebbe piacere cosi se ho sbaglaito io chiedo scusa( anche se in realta' penso che il professore in un primo momento pensasse che nel costruttore sia neccessario una istruzione di ritorno di qualcosa ). Mi piace sempre chiarire le discussione e avere l'ultima parola anche solo per chiedere scusa.
  • Re: Ritorno del costruttore

    L'esperienza insegna...fai una prova a stampare "gli indirizzi" di diversi tipi.

    Come?

    semplice, crea 3-4 classi "semplici" senza riscrivere il toString, e manda in stampa queste classi e analizza gli output
  • Re: Ritorno del costruttore

    Ciao Lysz210,
    
      MyClass a = new MyClass();
    
      // oppure
    
      MyClass a = new MyDerivedClass();
    
    La variabile 'a' contiene l' indirizzo di un oggetto, ovvero contiene un numero che indica una certa posizione in memoria.
    Come è codificato questo indirizzo non ci interessa e può variare da sistema a sistema (ad es. sui sistemi a 32 bit sono 4 byte). La variabile 'a' non contiene nient'altro, quindi non contiene informazioni sul tipo.

    Il compilatore in fase di compilazione conosce il tipo della variabile e sa come trattarla. Sa che la variabile sta puntando a un oggetto di tipo MyClass oppure a un suo derivato (questo concetto sta alla base del polimorfismo). Quindi il tipo di 'a' non è quello esatto dell' oggetto ma può essere quello di una sua classe base.

    Tramite 'IstanceOf' puoi scoprire a run-time il tipo esatto. Dove è scritta questa informazione? Si trova nella zona di memoria dove è allocato l' oggetto. Anche qui l' implementazione può variare da sistema a sistema, comunque si basa sul fatto che all' inizio della zona di memoria di ogni oggetto si trova un puntatore ad una tabella chiamata VMT e questa tabella è specifica per ogni tipo di oggetto.
  • Re: Ritorno del costruttore

    barba59 ha scritto:


    Ciao Lysz210,
    
      MyClass a = new MyClass();
    
      // oppure
    
      MyClass a = new MyDerivedClass();
    
    La variabile 'a' contiene l' indirizzo di un oggetto, ovvero contiene un numero che indica una certa posizione in memoria.
    Come è codificato questo indirizzo non ci interessa e può variare da sistema a sistema (ad es. sui sistemi a 32 bit sono 4 byte). La variabile 'a' non contiene nient'altro, quindi non contiene informazioni sul tipo.

    Il compilatore in fase di compilazione conosce il tipo della variabile e sa come trattarla. Sa che la variabile sta puntando a un oggetto di tipo MyClass oppure a un suo derivato (questo concetto sta alla base del polimorfismo). Quindi il tipo di 'a' non è quello esatto dell' oggetto ma può essere quello di una sua classe base.

    Tramite 'IstanceOf' puoi scoprire a run-time il tipo esatto. Dove è scritta questa informazione? Si trova nella zona di memoria dove è allocato l' oggetto. Anche qui l' implementazione può variare da sistema a sistema, comunque si basa sul fatto che all' inizio della zona di memoria di ogni oggetto si trova un puntatore ad una tabella chiamata VMT e questa tabella è specifica per ogni tipo di oggetto.
    Grazie mille molto esauriente, quindi per quanto riguarda la variabile e il puntamente l'ho capito bene. Per il resto Riesco a seguirti ma sono concetti ancora troppo avanzati per me. Mgari lo cairo in seguito. Sono riuscito a creare delle classi estese pero' non riesco ancora a utilizzarlo al meglio, mi ci vuole ancora molta pratica.

    zaknafein83 ha scritto:


    l'esperienza insegna...fai una prova a stampare "gli indirizzi" di diversi tipi.

    Come?

    semplice, crea 3-4 classi "semplici" senza riscrivere il toString, e manda in stampa queste classi e analizza gli output
    appena avro' un po di tempo faro' un paio di provre, ma se nonr icordo male toString() di dafault stampa una stringa non il tipo(la classe da cui e' stato creato) e l'indirizzo dell'oggetto istanziato. Purtroppo ho tempo molto ristretto perche lavoro e studio e vivo da solo( e perde un sacco di tempo in cucina per prepararmi da mangiare )
    Grazie a tutti e' stata una discussione interessantissima ora i miei dubbi sulla domanda iniziale sono completamente chiariti, e appena riusciro' a organizzare le domande sulle cose nuove che nel frattempo si sono aperte ne apriro' altri.
Devi accedere o registrarti per scrivere nel forum
8 risposte