Tuesday 28 February 2017

java - Object by Reference vs. Reference by Value



I read this comment here: Passing a String by Reference in Java?




Yes, it's a misconception. It's a huge, widespread misconception. It
leads to an interview question I hate: ("how does Java pass
arguments"). I hate it because roughly half of the interviewers
actually seem to want the wrong answer ("primitives by value, objects

by reference"). The right answer takes longer to give, and seems to
confuse some of them. And they won't be convinced: I swear I flunked a
tech screen because the CSMajor-type screener had heard the
misconception in college and believed it as gospel. Feh. – CPerkins
Aug 13 '09 at 14:34




Can someone please explain, in terms that a new programmer can grasp, what is the difference between saying:



"In Java primitives are passed by value and objects are passed by reference."




and:



"In Java nothing is passed by reference and references are passed by value."?



Are both of these statements true in some sense? I don't want to invite a rant parade, but this sounds like a really important concept, and one I still do not completely understand.


Answer



I believe the misconception lies in the fact that a variable can not contain an object to begin with. If you grasp that, then obviously variables can only contain references to objects (or primitive values). The step from there to realizing that references are passed by value (just as primitive values) is quite small.



There is a really easy test you can do to figure out if a language supports pass by reference. Ask yourself if you can write a swap function in the language, i.e. something that works like




x == A, y == B

swap(x, y);

x == B, y == A


As a Java programmer you realize quickly that you can't implement this in Java, thus you (correctly) draw the conclusion that Java does not have pass by reference.




Returning to your sentences:




  • In Java primitives are passed by value and objects are passed by reference.



This is false. I would argue that you can only pass something that is contained in a variable, and as I stated above, a variable can't contain an object, thus you can't pass an object at all in Java.




  • In Java nothing is passed by reference and references are passed by value.




This is true.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...