This week's book giveaway is in the Mac OS forum.
We're giving away four copies of a choice of "Take Control of Upgrading to Yosemite" or "Take Control of Automating Your Mac" and have Joe Kissell on-line!
See this thread for details.
The moose likes Beginning Java and the fly likes Another passing by reference question Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


JavaRanch » Java Forums » Java » Beginning Java
Bookmark "Another passing by reference question" Watch "Another passing by reference question" New topic
Author

Another passing by reference question

Nitish Bangera
Ranch Hand

Joined: Jul 15, 2009
Posts: 537

So that makes me ask, how can the A's bitpattern be reached if the bit pattern is gone and the reference is not there?



i guess its simple now.


[ SCJP 6.0 - 90% ] , JSP, Servlets and Learning EJB.
Try out the programs using a TextEditor. Textpad - Java 6 api
Vonique Leary
Ranch Hand

Joined: Mar 24, 2008
Posts: 107
Look at the "doStuff" method. "B = new Cat();" Remember what that means? B has it's bit of paper wiped and a new address (reference, bit pattern, call it what you will) written on it. This points at a new Cat on the heap.

A is still pointing at the old Cat. A's bit of paper (address/reference/bit pattern) has not been changed.


Try as I might I cannot get this question answered, and I think it is the key to the entire confusion for me:

In the method doStuff, B is just the parameter is it not? A is getting passed to it. So when you say that B has it's bit of paper wiped and a new address aren't we really talking about A? Because then you say A is still pointing at the old Cat. So I will ask again, there is an A (passed as an argument to the method to act as the B parameter) pointing to a new Cat, but then you say A is still pointing to the new Cat?

Am I confused about the method scope? Is it because A in the doStuff method goes out of scope?
Nitish Bangera
Ranch Hand

Joined: Jul 15, 2009
Posts: 537

A is not passed to it...... Only the copy of the bitpattern held in A is passed to B. THat's all

1 more thing pointing is a C++ word...Its double edged.Say A is referencing. If you refer your friend for a job in your company.But During the interview he is refered by a Different person. will your reference go off.
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 39074
    
  23
Can you wind your mind back to last night? Or was it all the wine? We thought you had it then; I think all these "bit patterns" have just confused you.

You have a Cat in your first method, which lives in memory at location 1234abcd (well, it might). So when you get to "A" you have

1234abcd <---- if you look in memory location 1234abcd you will find all the details of Cat "A".

on top of your stack (and lots of other numbers before it). Now you pass that cat to the doStuff method, so you have references on the stack to doStuff, then you pass the location of the cat object. Your stack will look something like this

1234abcd
xxxxxxxx
ijkijkij
xyzxyzxy
1234abcd

Look, your Cat "A" has reappeared. This is what Fred was on about last night, telling you about stack pointers. This is what it means by "pass-by-value". Your value is the location where you can find an object, and you see it has been passed onto the stack, as a copy. There are two references to your Cat on the stack, one which you called "A" and the JVM takes a copy of it, and you are calling this copy "B" in the doStuff method.
Now you tell your doStuff method to replace the Cat with another cat, which might be at memory location 2345bcde (it probably isn't, but in Java there is no way to prove that!). You take the original cat location off the stack and it now looks more like this

1234abcd
xxxxxxxx
ijkijkij
xyzxyzxy
2345bcde <---- The details of the new Cat are in memory location 2345bcde

You now manipulate your 2345bcde cat, and when your method finishes, Fred's stack pointer goes back, and your stack looks like this

1234abcd <---- pointer how here.
xxxxxxxx
ijkijkij
xyzxyzxy
2345bcde


Lo and behold, you forget everything struck through, and your original Cat has reappeared. That is 1234abcd. The same cat you had before. Your 2345bcde Cat has gone out of scope and next time you write anything on the stack all memory of where that cat was will vanish for ever.

I passed a Cat no 1 to doStuff, replaced it with Cat No 2 in the method, then when I got back to the original method, Cat No 1 was still there.
I got your phone number, and it was swapped for Joanne's phone number, but your phone number didn't change.
***************************************************************************************************************************************
If Java supported pass-by-reference (but it doesn't) you would be able to change the stack so it looks like this

2345bcde <---- pointer how here.
xxxxxxxx
ijkijkij
xyzxyzxy
2345bcde


But Java doesn't, so you can't change it like that.
Nitish Bangera
Ranch Hand

Joined: Jul 15, 2009
Posts: 537

I tried to make it simple using the bit pattern example....Well i hope the xerox example is simpler to understand.
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 39074
    
  23
Nitish Bangera wrote: a C++ word...
Don't understand that post, I am afraid.

Beware of thinking Java is an extension of C/C++. It is not; it is a completely different language. There are similarities in syntax, but they hide great differences. I think C++ supports pass-by-reference, C doesn't support it but allows you to mimic it. Java doesn't. It's different.
Nitish Bangera
Ranch Hand

Joined: Jul 15, 2009
Posts: 537

What i meant was actually saying pointing is C++ ish. In Java we say reference. That's all
Rusty Shackleford
Ranch Hand

Joined: Jan 03, 2006
Posts: 490
Vonique Leary wrote:
Look at the "doStuff" method. "B = new Cat();" Remember what that means? B has it's bit of paper wiped and a new address (reference, bit pattern, call it what you will) written on it. This points at a new Cat on the heap.

A is still pointing at the old Cat. A's bit of paper (address/reference/bit pattern) has not been changed.


Try as I might I cannot get this question answered, and I think it is the key to the entire confusion for me:

In the method doStuff, B is just the parameter is it not? A is getting passed to it. So when you say that B has it's bit of paper wiped and a new address aren't we really talking about A? Because then you say A is still pointing at the old Cat. So I will ask again, there is an A (passed as an argument to the method to act as the B parameter) pointing to a new Cat, but then you say A is still pointing to the new Cat?

Am I confused about the method scope? Is it because A in the doStuff method goes out of scope?


Scope is irrelevant to this problem.
Assume Cat overrides toString and prints the name of the cat.

Both A and B are in the same scope at all times. Passing the value of A to another method is not any different then the above example

The output would be:


The only thing that matters is the bit pattern stored in memory that represents A and B. Hopefully it is clear that the objects that reside at 0x0a and 0x10 and 0x14 are not the same object, even if the cat name is the same. Another good lesson is even if an overriden equals() or implemented compareTo() return true, that does not mean that the 2 references being compared both point to the same object.


"Computer science is no more about computers than astronomy is about telescopes" - Edsger Dijkstra
Vonique Leary
Ranch Hand

Joined: Mar 24, 2008
Posts: 107

Cat A = new Cat();
doStuff(A) // passes a copy of the bit pattern(just like you zerox a piece of paper and original document
// you keep it and then xerox you give it to your friend) and also A retains the bitpattern for it self.

void doStuff(Cat B) { // B receives a copy of the bitpattern.

B = new Cat(); // B is assigned a new bitpattern i.e overrides the old bitpattern. A had sent just the copy so the original
// bitpattern is there with A.(here your friend scribbles on his xerox paper won't affect your paper.)
}

Okay, I think I'm getting it now from the above code:

The first Cat's bitpattern (A) is transmitted to the method but then is overwritten by the creation of Cat B. The original A Cat still retains the original bitpattern. The second A is now a new Cat and has a new bitpattern, without any changes to the first A Cat. Am I getting it now?

I haven't read the other posts yet but will tonight and see if what I think is correct is supported by those explanations, which I think it is.

Thank you!
Christophe Verré
Sheriff

Joined: Nov 24, 2005
Posts: 14688
    
  16

Vonique, please check your PM.


[My Blog]
All roads lead to JavaRanch
Vonique Leary
Ranch Hand

Joined: Mar 24, 2008
Posts: 107
Campbell, I think I've got it now after reading your stack explanation. That worked. I think I was getting hung up on the reference name as opposed to the bit pattern and the actual object. But I think I have got it straight now. And I have read all your other explanations and found I consistently understood what you have been saying. So, a great big THANK YOU! to you and everyone who tried to help me. I so appreciate all the effort.

I think I really have it this time! It's a powerful feeling, after feeling so dumb.

No wine, either

Vonique
Jason Irwin
Ranch Hand

Joined: Jun 09, 2009
Posts: 327
Vonique Leary wrote:A is getting passed to it.

No, no, no. Remember - Java is pass by value. It is a copy of a that is passed, not a itself.

Java is not like, say, Visual Basic (thank god); is does not do pass by reference.

It is purely pass by value.
When you "pass" an object into a method, nothing happens to that object.
A copy of the reference is passed.

Whoops - didn't notice you had "got it". I'll leave this here anyway.


SCJP6
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 39074
    
  23
Vonique Leary wrote:Campbell, I think I've got it now after reading your stack explanation. That worked.
Well done

It was really Fred's explanation; I simply copied it out differently
. . . THANK YOU . . .
I think I really have it this time!
You're welcome.
No wine, either

Vonique
How about some beer?
Vonique Leary
Ranch Hand

Joined: Mar 24, 2008
Posts: 107
Yeah, we deserve one after all this, huh?......
Tarique Islam
Greenhorn

Joined: Oct 14, 2009
Posts: 5
Thanks a lot guys.. this thread was really helpful
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 39074
    
  23
Welcome to JavaRanch, Tarique Islam
Tarique Islam
Greenhorn

Joined: Oct 14, 2009
Posts: 5
Campbell Ritchie wrote:Welcome to JavaRanch, Tarique Islam


Thanks Ritchie... hope to learn from you all.
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Another passing by reference question