美文网首页
【Java】Java值传递解释

【Java】Java值传递解释

作者: 小王爱写BUG | 来源:发表于2023-08-09 21:07 被阅读0次

带你详细了解Java值传递和引用传递
如何理解java的值传递

值传递&引用传递

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。


image.png

Java中只有值传递

错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递
错误理解二:Java是引用传递。
错误理解三:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。

例子

public static void main(String[] args) {
  Test pt = new Test();
 
  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.setName("hollischuang");
  System.out.println("print in pass , user is " + user);
}

输出结果:

print in pass , user is User{name='hollis', gender='Male'}
print in main , user is User{name='hollischuang', gender='Male'}:
image.png

在参数传递的过程中,实际参数的地址0X1213456被拷贝给了形参。这个过程其实就是值传递,只不过传递的值得内容是对象的应用。
Java对象的传递,是通过复制的方式把引用关系传递了,如果我们没有改引用关系,而是找到引用的地址,把里面的内容改了,是会对调用方有影响的,因为大家指向的是同一个共享对象。

修改pass方法

public void pass(User user) {
  user = new User();
  user.setName("hollischuang");
  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'}
image.png

Java中的对象传递,如果是修改引用,是不会对原来的对象有任何影响的,但是如果直接修改共享对象的属性的值,是会对原来的对象有影响的。

总结

我们可以总结说,Java中的求值策略是共享对象传递,这是完全正确的。
但是,为了让大家都能理解你说的,我们说Java中只有值传递,只不过传递的内容是对象的引用。这也是没毛病的。

相关文章

网友评论

      本文标题:【Java】Java值传递解释

      本文链接:https://www.haomeiwen.com/subject/hpkcbrtx.html