前言
最近一年多的时间陆续接触了一些对我来说陌生的语言,主要就是 Python 和 Go ,期间为了快速实现需求只是依葫芦画瓢的撸代码;并没有深究一些细节与原理。
就拿参数传递一事来说各个语言的实现细节各不相同,但又有类似之处;在许多新手入门时容易搞不清楚,导致犯一些低级错误。
Java
基本类型传递
先拿我最熟悉的 Java 来说,我相信应该没人会写这样的代码:
@Test public void testBasic() { int a = 10; modifyBasic(a); System.out.println(String.format("最终结果 main a==%s", a)); } private void modifyBasic(int aa) { System.out.println(String.format("修改之前 aa==%s", aa)); aa = 20; System.out.println(String.format("修改之后 aa==%s", aa)); }
输出结果:
修改之前 aa==10修改之后 aa==20最终结果 main a==10
不过从这段代码的目的来看应该是想要修改 a 的值,从直觉上来说如果修改成功也是能理解的。
至于结果与预期不符合的根本原因是理解错了参数的值传递与引用传递。
在这之前还是先明确下值传递与引用传递的区别:
这里咱们先抛出结论, Java 采用的是值传递;这样也能解释为什么上文的例子没有成功修改原始数据。
参考下图更好理解:
当发生函数调用的时候 a 将自己传入到 modifyBasic 方法中,同时将自己的值复制了一份并赋值给了一个新变量 aa 从图中可以看出这是 a 和 aa 两个变量没有一毛钱关系,所以对 aa 的修改并不会影响到 a 。
有点类似于我把苹果给了老婆,她把苹果削好了;但我手里这颗并没有变化,因为她只是从餐盘里拿了一颗一模一样的苹果削好了。
如果我想要她那颗,只能让她把削好的苹果给我;也就类似于使用方法的返回值。
a = modifyBasic(a);