为什么说Java是值传递?

值传递和引用传递的区别

值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:是指在调用函数时将实际参数的地址直接传递到函数中(的形参),那么在函数中对参数所进行的修改,将影响到实际参数

javamodel传值 java值传递是什么意思_javamodel传值

Java中的基本数据类型是值传递

javamodel传值 java值传递是什么意思_javamodel传值_02


只是将实际参数复制一份传递给形参,在函数中对参数进行修改不会影响到实际参数的值

Java中的引用数据类型也是值传递

javamodel传值 java值传递是什么意思_javamodel传值_03

在上面参数传递的过程中,实际参数的地址0x123456被拷贝给了形参,在函数中,并没有对形参本身进行修改,而是修改形参持有地址中存储的内容。

![在这里插入图片描述](https://img-blog.csdnimg.cn/d2614346bd1648129abdfc043ac3b235.png

javamodel传值 java值传递是什么意思_Java_04

接下来举个例子:

![在这里插入图片描述](https://img-blog.csdnimg.cn/4095d16f741f48049c5ce20cbb3eb7fd.png

javamodel传值 java值传递是什么意思_引用传递_05


解释一下:

在main中创建一个user对象的时候,在堆中开辟一块内存,带有name和age属性,user也持有该地址0x123456

在调用function函数的时候,将user作为实际参数传递给形参xingCan中,会把这地址0x123456交给xingCan,这是xingCan也指向这个地址

在fuction函数内部对参数进行了修改,xingCan = new User(); 在内存中会重新开辟一块空间0x456789赋值给xingCan,后面对形参的任何操作都不会影响0x123456改地址的对象

javamodel传值 java值传递是什么意思_Java_06

我们先来看Test2该类的例子:
实参是一个对象,形参又通过new创建了一个新的对象,因此实参和形参不是同一个参数
通过打印出来的结果来看,实参也没有被改变,因此引用数据类型不是一个引用传递

画图来理解一下:

javamodel传值 java值传递是什么意思_Java_07