天天看点

(转载)图解Java中的参数传递

今天做项目,发现了一个问题,当string作为参数传递的时候,在函数内部改变值对外部的变量值无影响,如下代码:

一开始不解后来想想就明白了,遂去对java参数传递做一个总结,以加深自己的基础知识.

对于:

整型: byte short int long

浮点型 float double

逻辑型 boolean

字符型 char

四类八种基本类型来说,传递的都是值,因为这些值是直接保存在栈内存中的,所以传递的时候直接拷贝过去了.

结构如下图,也因此最外层的num的值并没有受到影响.

(转载)图解Java中的参数传递

2.对象传递

对象传递,本质上也都是值传递,只不过传递的值是该引用的拷贝.看下面实例和图解:

结构图如下:

当执行change的时候,会把person变量的指向的地址拷贝一份给personchange,两者都指向同一个堆内存,即使后面做了set方法修改,但是对两者的执行毫无影响.

(转载)图解Java中的参数传递

例二和之前的不同之处在change里面,对personchange进行了new操作.代码如下:

当执行change的时候,会把person变量的指向的地址拷贝一份给personchange,两者都指向同一个堆内存,接下new操作会在堆中重新创建一个person对象,此时personchange则指向这个对象,而原person的指向没发生变化,故输出aaa 11.

(转载)图解Java中的参数传递

例三是综合例一和例二,前面两个搞懂的话这个就很容易懂了.

读者自己理解下,不懂的话再看看前面的,看看为什么输出ccc 11

(转载)图解Java中的参数传递

终于到最初的问题,为什么string是对象,但是却不符合上面对象传递测试出来的结果?

原因:

因为string对象具有不可变性,所以针对操作str = "22222",在string池中不存在的时候,就是相当于str = new string(),这样变化下的话,那么就和例一 一模一样了,具体图就不画了,希望对你有帮助.

要理解上面的结果,就要认为java中只有值传递:

对于基本类型,直接拷贝值传递过去

对于对象,拷贝当前对象的引用地址,然后把该地址传递过去,所以也是值传递.

原文链接:https://zhuanlan.zhihu.com/p/24556934?utm_source=qq&utm_medium=social