《零基础学 Java》 FAQ 之 8-Java 方法调用是传值还是传引用
Java方法调用是传值还是传引用
@业余草 在“73 | 父类和子类的引用赋值关系”里问到
回答
只说答案没意思,既然同学感兴趣就聊个几块钱的吧。
先给出答案。其实 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
版权声明: 本文为 InfoQ 作者【臧萌】的原创文章。
原文链接:【http://xie.infoq.cn/article/9f6f2eca7326cd74687e9ef3c】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论 (2 条评论)