正文
这是很容易理解的, 车的颜色从red被改成了blue。
如果修改一下TestReference, 让它去调用process.function2(car) , 会有什么效果呢? 有经验的程序员可能立刻就能给出答案:
在main函数中的那个红色的车根本没有受到影响。
为什么会这样呢? 其实在Java函数调用的过程当中,对于对象类型的参数,Java传递的是这个对象引用的copy, 这个引用的copy和原引用都指向堆上的同一个对象。
在function1中, 虽然使用的是原有引用的copy,但是操作的却是堆中的对象, 于是把这个颜色值改成了blue .
在function2中把这个copy指向了新对象 car2, 那main函数中原有的引用呢? 还是指向堆中的老的对象, 所以没有改变。
理解到这里,一般来说就够了,但是对于一个刨根问底人,肯定要继续挖掘一下,深入到字节码层次去看看。
首先得理解一下JVM是怎么实现函数调用的, 其实也很简单,JVM把每个函数都封装成一个叫做“帧(Frame)”的东西, 在这个Frame当中,最重要的两个东西就是局部变量表和操作数栈。
Java 的计算都是基于栈, 在函数执行过程中会不停地入栈、出栈,计算。 有些中间结果和局部变量就会暂时存放到局部变量表中。
那当main函数调用function2的时候会是什么状况呢?