一直以来对java的值传递类型不是太了解,网上的很多blog说法不一。
今晚仔细的看了几篇blog,整理了一下我的看法。
首先,我们会对值传递和引用传递发生混淆是因为我们对这两个传递的理解有问题
值传递:传递的是从实际参数copy过来的数据。例如copy对象的地址,copy变量。
引用传递:传递的是实际参数的引用。
看着上面的解释,是不是感觉有点绕,实际参数的引用不就是地址吗?那不是跟上面值传递时copy对象的地址一样吗?
虽然看起来是一样的,但是两者却有本质上的区别
指针传递(值传递)参数本质上是值传递的方式,它所传递的是一个地址值。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(仅仅只是copy变量的地址)
引用传递过程中,被调函数的形式参数虽然同样作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量(是变量的别名,它与变量紧密相连)
按我自己的理解
引用传递其实就是将对象地址指向的空间传给了我们,我们在改变引用的时候实际上改变了存储空间的存储。所以实际参数在使用的时候会发现实际参数已经被改变了。
值传递其实是将对象的地址copy了一份给我们。
我们可以改变存储了对象地址的变量。但是我们不能改变引用传递传递给我们的空间,我们能改变其空间里面所存储的东西。
在java中,进行的都是值传递。
证据:改变引用的值就会改变实际参数的值,但是java中不会这样子
public static void main(String[] args) {
ParamTest pt = new ParamTest();
User hollis = new User();
hollis.setName("Hollis");
hollis.setGender("Male");
pt.pass(hollis);
System.out.println("print in main , user is " + hollis);
}
public void pass(User user) {
user = new User();
user.setName("hollischuang");
user.setGender("Male");
System.out.println("print in pass , user is " + user);
}
输出结果
print in pass , user is User{name='hollischuang', gender='Male'}
print in main , user is User{name='Hollis', gender='Male'}
如果java使用的是引用传递的话,那么打印的第二行和第一行应该是相同的结果。
以上基于自己的理解和参考各位大佬的文章,如果有不对的地方,欢迎探讨指正。