专栏名称: 码农翻身
工作15年的前IBM架构师分享好玩有趣的编程知识和职场的经验教训, 不容错过。
目录
相关文章推荐
51好读  ›  专栏  ›  码农翻身

Java 函数调用是传值还是传引用? 从字节码角度来看看!

码农翻身  · 公众号  · 程序员  · 2017-06-09 17:34

正文

请到「今天看啥」查看全文



这是很容易理解的, 车的颜色从red被改成了blue。


如果修改一下TestReference, 让它去调用process.function2(car) , 会有什么效果呢? 有经验的程序员可能立刻就能给出答案:



在main函数中的那个红色的车根本没有受到影响。


为什么会这样呢?  其实在Java函数调用的过程当中,对于对象类型的参数,Java传递的是这个对象引用的copy,   这个引用的copy和原引用都指向堆上的同一个对象。


在function1中, 虽然使用的是原有引用的copy,但是操作的却是堆中的对象, 于是把这个颜色值改成了blue .


在function2中把这个copy指向了新对象 car2, 那main函数中原有的引用呢? 还是指向堆中的老的对象, 所以没有改变。


2 如何实现函数调用


理解到这里,一般来说就够了,但是对于一个刨根问底人,肯定要继续挖掘一下,深入到字节码层次去看看。


首先得理解一下JVM是怎么实现函数调用的, 其实也很简单,JVM把每个函数都封装成一个叫做“帧(Frame)”的东西, 在这个Frame当中,最重要的两个东西就是局部变量表和操作数栈。



Java 的计算都是基于栈, 在函数执行过程中会不停地入栈、出栈,计算。 有些中间结果和局部变量就会暂时存放到局部变量表中。


那当main函数调用function2的时候会是什么状况呢?








请到「今天看啥」查看全文