Newsgroup: it.comp.java
Titolo: parametro

Ciao a tutti.
E' possibile passare delle variabili, o oggetti, per riferimento?
Se si', come?
Grazie in anticipo.
Maurizio

maurizio pignotti wrote:

No. Java passa *tutti* i parametri per valore (sia i tipi primitivi che 
oggetti).
Tieni conto perņ che quando passi ad un metodo un oggetto come parametro 
viene passato per valore il riferimento all'oggetto stesso.Ciņ vuol dire 
che benchč il parametro sia passato per valore *punta* allo stesso oggetto 
quindi invocando i metodi di tale oggetto puoi modificare lo stato interno 
dell'oggetto passato in ingresso.
Spero di non averti incasinato troppo e di non aver scritto troppe fesserie 
:-)
Ciao ciao
Dani
-- 
Daniele Piras
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If at first the idea is not absurd then there is no hope for it. 
- Albert Einstein
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ciao,
a quanto mi e' stato detto Java passa rigorosamente per valore i tipi
primitivi:
    long, int, boolean, byte, char etc. etc.
Mentre Java passa per referenza (o puntatore) tutti gli oggetti che non
siano primitivi.
Il fatto che si dica che Java non ha puntatori significa che non ha i
puntatori classici del C
e C++ con la connessa aritmetica!
La spiegazione di Piras Daniele mi e' un po' oscura; che significa passare
per valore il parametro
che punta allo stesso oggetto. Anche in C si passa per valore l'indirizzo
(se si puo' dire).
Ciao
a tutti
Gianluca

Questo è quanto afferma in proposito Bruce Eckel in "Thinking in java" sul
tema "Passing by Value"; offre due punti di vista che comunque portano alla
solita soluzione; coi tipi primitivi si ottiene una copia distinta, con gli
oggetti un puntatore (senza la possibilità di applicare l'aritmetica dei
puntatori, comunque e sempre un puntatore):
This brings up the terminology issue, which always seems good for an
argument. The term is "pass by value," and the meaning depends on how you
perceive the operation of the program. The general meaning is that you get a
local copy of whatever you're passing, but the real question is how you
think about what you're passing. When it comes to the meaning of "pass by
value," there are two fairly distinct camps:
1.  Java passes everything by value. When you're passing primitives into a
method, you get a distinct copy of the primitive. When you're passing a
reference into a method, you get a copy of the reference. Ergo, everything
is pass-by-value. Of course, the assumption is that you're always thinking
(and caring) that references are being passed, but it seems like the Java
design has gone a long way toward allowing you to ignore (most of the time)
that you're working with a reference. That is, it seems to allow you to
think of the reference as "the object," since it implicitly dereferences it
whenever you make a method call.
2.  Java passes primitives by value (no argument there), but objects are
passed by reference. This is the world view that the reference is an alias
for the object, so you don't think about passing references, but instead say
"I'm passing the object." Since you don't get a local copy of the object
when you pass it into a method, objects are clearly not passed by value.
There appears to be some support for this view within Sun, since one of the
"reserved but not implemented" keywords was byvalue. (There's no knowing,
however, whether that keyword will ever see the light of day.)
Having given both camps a good airing, and after saying "It depends on how
you think of a reference," I will attempt to sidestep the issue. In the end,
it isn't that important-what is important is that you understand that
passing a reference allows the caller's object to be changed unexpectedly.
Ciao.

 che punta allo stesso oggetto.
Vuol dire che quando viene passato un oggetto .. quello che viene
effettivamente passato è una *copia* del valore del puntatore dell'oggetto
stesso .. quindi formalmente il passaggio avviene per valore.
Dal libro del mitico Bruce:
.  "Java passes everything by value. When you're passing primitives into a
method, you get a distinct copy of the primitive. When you're passing a
reference into a method, you get a copy of the reference. Ergo, everything
is pass-by-value"
Ciao ciao


 
Con tutto il rispetto di TIJ (che ha pero' il vantaggio di essere 
disponibile for free): fa fede il libro di Gosling, "Java Programming 
Language, 3rd edition", so che e' anche stato tradotto in Italiano.
Chi non ce l'ha, si inginocchi sui ceci in sala mensa.
uL


Oltretutto mi fa venire dei dubbi anche su come viene passato un valore o un
indirizzo in C ... mumble...mumble. :-))
Quindi se ho capito bene dalla frase:
"When you're passing a reference into a method, you get a copy of the
reference."
quando passo la referenza di un oggetto in realta' passo la copia di una
referenza (quindi qui ne passo il valore)
che pero' punta allo stesso oggetto....
A me viene piu' facile pensare passo l'indirizzo dell'oggetto e quindi
quando chiamo l'oggetto
da dentro il metodo "faccio riferimento" all'oggetto che sta fuori dal
metodo ( maccheronicamente parlando)
Ciao
e grazie per la delucidazione
Gianluca

 
L'importante e' che tu non abbia problemi nel seguire codice 
"intricato", in cui i references si copiano in giro per i metodi e 
vengono passati e ripassati. Di solito e' piu' facile pensando "per 
copia", ma il risultato e' quello che conta. Se invece lo devi spiegare 
a qualcuno, mi raccomando: Sun promuove la versione "per copia", anche 
perche' e' quello che succede effettivamente.
ciao
uL

 (se si puo' dire)
Si puo' dire: e' esattamente cosi'. :-) L'unica differenza tra 'puntatori' 
e 'riferimenti' e' che sui primi e' disponibile un'aritmetica, sui secondi 
no (o se vuoi, sono puntatori opachi, che puoi solo dereferenziare, ma non 
vederne il valore, cioe' l'indirizzo contenuto).
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 valore o un indirizzo in C ...
In C, come in Java, tutto viene passato per valore. :-)
