Salve,
partendo da alcune considerazioni teoriche lette sui manuali e di un passo di questo forum vorrei fare alcune considerazioni riguardo l'istruzione nel titolo, ed i puntatori in generale, e proporvele al fine di essere smentito se le mie "intuizioni" risultassero erronee. Penso che questa discussione possa essere di aiuto a molti di quelli che si avvicinano a Java e non solo.
Nella seguente istruzione:
Abbiamo un istruzione di assegnazione. L'operatore binario uguale (=) è un operatore di assegnazione che associa da dx a sx. Quindi viene valutata per prima l'espressioneCodice PHP:Dog d = new Dog();
1) new Dog();
L'operatore new alloca la memoria in cui verrà conservato l'oggetto Dog, dopodiché new chiama il costruttore Dog() per inizializzare le variabili d'istanza del nuovo oggetto Dog in uno stato consistente.
L'istruzione new Dog(), quindi, serve a creare un nuovo oggetto anonimo di tipo Dog. Gli oggetti anonimi, privi cioè di riferimenti espliciti con cui chiamarli, vengono usati anche nelle chiamate di metodo a cascata. In realtà, suppongo, al nuovo oggetto Dog Java assegnerà cmq un riferimento automatico per i suoi fini interni, a noi però sconosciuto.
2) Dog d
Questa istruzione crea un oggetto d di tipo Dog, a partire cioè dalla classe Dog. Questo oggetto però non è stato inizializzato, quindi le sue variabili d'istanza si trovano in uno stato inconsistente. Il valore di d è quindi null e pertanto inutilizzabile.
3) Operatore uguale (=)
L'operatore di assegnazione assegna il valore dell'oggetto anonimo new Dog() all'oggetto d di tipo Dog
Nell'istruzione Dog d = new Dog() vengono quindi creati 2 oggetti : uno anonimo privo di riferimento ed uno non inizializzato il quale, per mezzo dell'operatore uguale, sarà inizializzato con i valori dell'oggetto anonimo.
Ad ogni oggetto è associato un indirizzo di memoria, grazie al quale è possibile reperire l'esatta posizione in cui si trova l'oggetto all'interno della memoria temporanea dell'elaboratore, al fine di poterlo usare. Quindi in realtà essendoci due oggetti inizialmente ci sono due corrispondenti indirizzi di memoria che grazie all'operatore di assegnamento vengono in qualche modo associati.
Il problema nasce dalle diverse diciture adottate dai vari manuali. Nei vari manuali ci si riferisce a d sia come "oggetto" che come "variabile reference". Probabilmente entrambe le diciture sono corrette...ma non sarebbe più corretto dire, se le mie considerazioni sono giuste, che d è un oggetto con un suo specifico indirizzo di memoria a cui viene passato il valore di un oggetto dello stesso tipo ma omonimo?
La differenza è sottile e ve la espongo con altri termini:
E' l'indirizzo di memoria di d che viene cambiato, passando dall'iniziale indirizzo assegnatogli a quello dell'oggetto anonimo o in realtà i due indirizzi rimangono immutati, solo che ora d contiene i valori dell'oggetto anonimo e quindi usare d o l'oggetto anonimo - nella pratica - risulta indifferente?
Infine, la creazione di due oggetti per usarne, nella pratica, solo uno non è uno spreco notevole di risorse?
Grazie dell'attenzione, attendo correzioni![]()
Matteo

Rispondi quotando
