| Author |
Another passing by reference question
|
Nitish Bangera
Ranch Hand
Joined: Jul 15, 2009
Posts: 536
|
|
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: 536
|
|
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: 32611
|
|
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: 536
|
|
|
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: 32611
|
|
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: 536
|
|
|
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: 14669
|
|
|
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: 32611
|
|
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: 32611
|
|
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.
|
 |
 |
|
|
subject: Another passing by reference question
|
|
|