写点什么

《零基础学 Java》 FAQ 之 8-Java 方法调用是传值还是传引用

用户头像
臧萌
关注
发布于: 2020 年 05 月 18 日
《零基础学 Java》 FAQ 之 8-Java方法调用是传值还是传引用

Java方法调用是传值还是传引用



@业余草 在“73 | 父类和子类的引用赋值关系”里问到



问一下老师:Java 中是“值传递”还是“引用传递”?

回答



只说答案没意思,既然同学感兴趣就聊个几块钱的吧。



先给出答案。其实 Java 只存在一种传参的方式,就是用实参给形参赋值。



其实Java比C++要简单,Java的参数传递就一句话:把形参当成方法的局部变量,然后在方法调用时,把实参的值,赋值给形参。



完事儿了,就这么简单,没有指针,没有地址,没有第二种可能和操作。



所以,形参无论怎么折腾,都无法影响实参一丝一毫。这点在参数为基本数据类型时毫无混淆的可能。



但是如果参数是个引用,就略绕一点点,但也只是一点点。如果参数是个引用,那么很简单,其实就是形参和实参这两个引用,指向同一个对象而已。仅此而已。



如果形参在方法代码里再指向别的对象,那么还是那句话,对实参没有任何影响,实参还是指向之前的对象。



既然如此,为什么会流传着么一个“java是传值还是传引用”的问题呢?而且很多年前这还是一个非常火的面试题。



究其原因,可能是面试官有C++的背景。因为把这个问题里的java换成C++,就是一道很好的面试题目。



把这个题目当作Java的面试题,首先就是有问题的。Java中的引用类型也是一种值的类型,引用类型的参数传递,即是传值(引用本身就是一种数据类型,数据类型就有值),也是传引用,所以这个问题就模棱两可。这个问题只有在C++这种语言的语境下才有意义。因为那里的对象传值有不一样的含义。



再深入来说,Java分为堆内存和栈内存,分别用来存储对象(new出来的)和局部变量+参数。参数赋值,就是从一个栈内存复制到另一个栈内存,堆内存不会受影响。



所以,即使知道了Java里每个字节是怎么跳动的,依然无法回答着么一个问题。这个问题之于Java就好像问一个司机你炒鸡蛋的时候挂几档起步一样穿越 (-:






这篇文章来自极客时间推出的《零基础学Java》中的FAQ。除了在每节视频课下方回答大家的问题之外,针对大家提出的优质问题或者普遍问题,如果需要更大篇幅的文章解答,则会在FAQ中以文章的方式给出回答。带你零基础入门,夯实Java,课程地址:https://time.geekbang.org/course/intro/181



发布于: 2020 年 05 月 18 日阅读数: 77
用户头像

臧萌

关注

一线程序员,偶尔写写字 2017.10.20 加入

《零基础学 Java》,《职场求生攻略》 视频课作者 《Java入门1·2·3》作者

评论 (2 条评论)

发布
用户头像
文题不符
2020 年 05 月 27 日 16:24
回复
Sorry,FAQ搬家的时候串货了😳,修正过来了。
2020 年 07 月 28 日 19:52
回复
没有更多了
《零基础学 Java》 FAQ 之 8-Java方法调用是传值还是传引用