On Thu, 12 Aug 1999, Chris Pratt wrote:
> Wrong, Wrong, Wrong. Your example is correct, but that's because
> you're changing the value of the reference, not the value of the
> String (remember String's are immutable). Java uses Pass by
> Reference for Objects and Pass by Value for intrinsic types (int,
> float, char, etc). This has been a major source of confusion with
> the Java detractors saying that the entire contents of each Object
> must be copied to the stack since Java is "pointerless". If you
> don't believe me, try this program. I bet you get "i = 10"
First: I think you have a mistake in your code, at least in terms of
what you are trying to illustrate. The line:
obj.add(5);
in your main was probably meant to be:
process_me(obj);
Second: Actually, *you* are wrong. Java does *not* use
pass-by-reference, at least not what is traditionally known as
pass-by-reference. If it did, and using your example, I could do the
following:
public class test {
public static void process_me(Obj o) {
o = new Obj(10);
}
public static void main(String[] args) {
Obj obj = new Obj(5);
System.out.println("obj = " + obj);
process_me(obj);
System.out.println("obj = " + obj);
}
}
and the two println's would show something different. But they won't.
It's true that Java uses pass-by-value for the primitive types, but
what it uses for Objects is not quite pass-by-reference. It does pass
a reference (i.e. pointer) to the object, but you can only use that to
manipulate the object indirectly (i.e. through what methods the object
allows), not directly (i.e. via assignment). Pass-by-reference allows
the latter.
You might think that because you can affect the value of an Object
parameter, Java is using pass-by-reference, but there are other
parameter passing techniques that allow this; pass-by-reference and
pass-by-value aren't the only two possibilities.
BTW, in an earlier post I said that C's '&' operator allowed
pass-by-reference; this isn't technically correct. It's still the
value that's being passed, it's just that the value is the address of
(i.e. pointer to) a variable, and C's use of pointers allows you to
manipulate the contents of a variable through it's pointer (which Java
doesn't).
> class Obj {
> int i;
>
> public Obj (int i) {
> this.i = i;
> }
>
> public int add (int j) {
> i += j;
> return i;
> }
>
> public String toString () {
> return String.valueOf(i);
> }
>
> }
>
> public class test {
>
> public static void process_me(Obj o) {
> o.add(5);
> }
>
> public static void main(String[] args) {
> Obj obj = new Obj(5);
> obj.add(5);
> System.out.println("obj = " + obj);
> }
>
> }
>
> ----- Original Message -----
> From: Ted Neward <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Thursday, August 12, 1999 10:57 PM
> Subject: Re: will this code work?
>
>
> > Folks, the confusion, IMHO, is pretty simple: the difference between
> > returning a parameter and the parameter passed in to the method.
> >
> > For example, had the code been written this way:
> >
> > public class Param
> > {
> > public static void main(String[] args)
> > {
> > String temp = null;
> > manipParameter(temp);
> > System.out.println("temp = " + temp);
> > }
> >
> > private static void manipParameter(String param)
> > {
> > param = "This should be modified";
> > }
> > }
> >
> > the resulting output would be:
> >
> > temp = null
> >
> > because Java supports pass-by-value semantics, not pass-by-reference, even
> > for Object-derived types. (This is where Java's insistence that it has no
> > pointers really trips people up.) This means that the POINTER to String,
> > held by temp, is copied into the String reference named "param", and
> > subsequent modification of "param" has no effect on the original reference
> > "temp".
> >
> > For all you C++-heads out there, the difference is one of
> >
> > void manipParameter(String* pString); // THIS is what Java does,
> effectively
> >
> > vs.
> >
> > void manipParameter(String& pString); // THIS is NOT what Java does
> >
> > Hence, Shiraz is correct in that the *parameter*, temp, (not the lvalue of
> > the return value's assignment) will not be modified.
> >
> > However, because the original code was written to not only use the
> (wrongly)
> > assumed pass-by-reference semantics, but also to copy the return value
> into
> > temp:
> >
> > >> >> temp = process_me(temp);
> >
> > the code worked as expected.
> >
> > In short, everybody's right, bur for different reasons. :)
[ ... ]
Milt Epstein
Research Programmer
Software/Systems Development Group
Computing and Communications Services Office (CCSO)
University of Illinois at Urbana-Champaign (UIUC)
[EMAIL PROTECTED]
___________________________________________________________________________
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff SERVLET-INTEREST".
Archives: http://archives.java.sun.com/archives/servlet-interest.html
Resources: http://java.sun.com/products/servlet/external-resources.html
LISTSERV Help: http://www.lsoft.com/manuals/user/user.html