|
|
|
![]() |
|
Strumenti |
![]() |
#121 | |
Member
Iscritto dal: Jan 2008
Messaggi: 111
|
Quote:
Faccio notare che usare array di Integer (oggetti) oppure array di int (tipo primitivo) è indifferente, ai fini dell'esempio. |
|
![]() |
![]() |
![]() |
#122 | |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
Quote:
__________________
Khelidan |
|
![]() |
![]() |
![]() |
#123 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
|
|
![]() |
![]() |
![]() |
#124 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
|
|
![]() |
![]() |
![]() |
#125 | |
Senior Member
Iscritto dal: Dec 2006
Messaggi: 314
|
Quote:
Il metodo "dettagli" restituisce un reference ad un oggetto di tipo String.
__________________
Athlon64 x2 5600 - AsRock ALiveNF5eSata2+ - kingston 2GB ddr2 800 - GeForce 8800gts 320MB |
|
![]() |
![]() |
![]() |
#126 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
prima dell' invocazione della stampa viene costruita una nuova stringa composta dalla parte letterale alla sinistra dell' operatore di concatenazione (+) e dalla parte a destra derivante dalla chiamata di dettagli(). Al metodo print viene passata una copia del riferimento a tale stringa. Le modifiche attuate attraverso tale riferimento si riflettono sull' oggetto reale (in realtà per le stringhe è un po diversa la situazione perchè si tratta di oggetti immutabili), mentre eventuali assegnamenti non modificano il riferimento originale .
|
![]() |
![]() |
![]() |
#127 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
"Copia di reference" e riferimento non sono la stessa cosa: nel primo caso non è possibile interrompere il riferimento originale, nel secondo si.
|
![]() |
![]() |
![]() |
#128 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
int j= 10; nomeOggetto.metodo (j); è esattamente uguale a nomeOggetto.metodo (10); quello che poi con il valore attribuito ad i dipende dal corpo del motodo. |
|
![]() |
![]() |
![]() |
#129 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
solo ed esclusivamente in presenza di tipi primitivi (ed in realtà con gli oggetti immutabili come le stringhe).
|
![]() |
![]() |
![]() |
#130 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Si. Le stringhe persò essendo oggetti vengono trattati come tali, anche se alla fine la gestione è per valore, per via della loro natura immutabile.
|
![]() |
![]() |
![]() |
#131 |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
mah diciamo che la copia del reference io la considero un passaggio per valore, sono per quella scuola di pensiero
__________________
Khelidan |
![]() |
![]() |
![]() |
#132 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
E' parificabile ad un passaggio per valore, solo in presenza di oggetti immutabili come le stringhe. Qualora ci sia anche un solo metodo mutatore (o una variabile con scope valido) non è assolutamente un passaggio per valore, che implica il mancato effetto, sull' entità originale, di eventuali modifiche.
|
![]() |
![]() |
![]() |
#133 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Una reference ad un oggetto viene passata come parametro ad un metodo. La reference sta da qualche parte in memoria: viene letto il suo contenuto e viene copiato in una nuova reference, locale al metodo chiamato. Io questo l'ho sempre sentito chiamare "copia per valore". La reference, in Java, non è altro che un puntatore costante (da non confondere con un puntatore a costante), quindi la reference locale, che è copia della reference passata come parametro, non può essere modificata (come indirizzo di allocazione, al massimo la si può far puntare ad un altro oggetto). Risultato? La reference esterna non la puoi modificare, il che combacia con la definizione che hai dato di passagio per valore. Notare che in tutto questo l'oggetto effettivo non entra in gioco: per tutto il tempo lui è rimasto là dov'era al tempo della sua allocazione tramite l'operatore new (al netto di eventuali spostamenti & cazzi e mazzi che può combinare il Garbage Collector, ma non me ne intendo, non so se ci siano implementazioni di GC che deframmentano l'heap ![]() Attenzione quindi che A) in Java il passaggio dei parametri ai metodi è sempre e solo per valore; B) Ciò che viene effettivamente copiato/passato ad un metodo sono i tipi primitivi del linguaggio (boolean, byte, short, int, long, float, double) e le reference a un oggetto, mai gli oggetti veri e propri [e grazie a questo è molto efficiente proprio perchè non si verificano mai operazioni di copia degli oggetti, a differenza ad esempio di C/C++].
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#134 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Cosa differenzia questo meccanismo da quello del C/C++, il fatto che al posto di passare il puntatore tale e quale(detto in maniera molto poco formale), si va a leggere l' indirizzo contenuto nella variabile reference e se ne fa una copia, ma ciò non esula dal fatto che ci sia un accesso diretto all' oggetto in questione. Ultima modifica di nuovoUtente86 : 04-05-2010 alle 18:46. |
|
![]() |
![]() |
![]() |
#135 | |
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Quote:
Ammetto però che la mia conoscenza del C / C++ è molto meno approfondita di quella del Java, per cui potrei avere frainteso qualche definizione.
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN |
|
![]() |
![]() |
![]() |
#136 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
|
|
![]() |
![]() |
![]() |
#137 | |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Quote:
O no?
__________________
|Java Base| |
|
![]() |
![]() |
![]() |
#138 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Java ha il passaggio per valore e stop, esattamente come C.
Dire il contrario significa non aver chiaro il concetto di variabile e di valore. Se ho una variabile x e un metodo m che accetta un argomento p, quando dico: m(x) p cos'è? Se è una variabile il cui valore è lo stesso di x è passaggio per valore. Se è una variabile il cui valore è l'indirizzo di x è passaggio per riferimento. La dereferenziazione cui eventualmente posso sottoporre il parametro non c'entra una mazza coi termini del passaggio della variabile: è un'altra operazione. Sarebbe come dire che l'invocazione di metodo in Java supporta la cancellazione del disco fisso perchè dentro a quel metodo posso scrivere "format c:".
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#139 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
In Java esiste un passaggio per riferimento. No almeno io non l' ho mai detto. Java passa i parametri per copia? Si anche questo è vero, ma dire che il passaggio sia sempre e solo per copia è quantomeno riduttivo o può generare confusione. Object o=new Object() la variabile o contiene un riferimento alla locazione contenete l' oggetto faiQualcosa (Object o){} faiQualcosa(o); riceve una copia dell' indirizzo dove si trova l' Object, attraverso cui potervi accedere. E' corretto dire che le variabili siano passate per valore? Si per parliamo di variabili, ma non se parliamo di Oggetti in sè. Mentre in c++ è possibile passare una copia dell' oggetto, in Java ciò non è possibile in quanto ad essere copiato è il riferimento che, come già detto, è trattato come qualsiasi altro tipo primitivo. |
|
![]() |
![]() |
![]() |
#140 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Nono, il fulcro non è filosofico.
Nel passaggio si parla di passaggio di variabili, non altro. Quando in C++ passi una variabile ad un metodo il cui parametro è "by reference" sempre la variabile passi: int x = 10; void fun(int& p) { p = 20; } fun(x) <- x viene passato alla funzione Hai una variabile che viene passata ad una funzione esattamente come fai in Java a prescidere dal genus di quella variabile. Non è che non si possano esplorare nuove qualificazione, ci mancherebbe. Ma il problema di dire "ok, lo chiamiamo passaggio per copia di riferimento" è che la differenza che sta tra il passaggio per copia di riferimento e "il passaggio per copia di primitivo" è la stessa che c'è tra il riferimento e il primitivo: uno è dereferenziabile, l'altro no.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:03.