Java到底是值传递还是引用传递呢(清晰解读版)

前言:当学到Java对象(引用)作为参数传递时,产生疑惑:Java是值传递还是引用传递?查阅资料后,总结了自己认为正确的解释。

什么是值传递?

将实参的内容拷贝一个副本给形参,当形参在方法中被修改时,只是修改了实参的一个副本而已,对实参本身是毫无影响的

例如:实参和形参是两只盒子,实参盒子里有一篇文章,将文章复印了一模一样的一份放在了形参盒子里,对形参盒子里那份文章无论如何修改,实参盒子里的文章纹丝不动(要是有改变,那肯定是见鬼了哈哈)

什么是引用传递?

将实参的自身地址传给形参,此时形参可以看作就是实参本身,当形参的内容在方法中被修改时,相当于修改了实参的内容,因为形参和实参就是同一个对象。

例如:一个实参包裹里有一张纸,备货员根据包裹单号找到此包裹,将包裹内的纸换成了一个苹果,此时实参包裹里的东西已经被改变了(是通过包裹的单号找到了实参包裹本身,此时实参包裹和形参包裹是同一个包裹)

那么Java是值传递还是引用传递呢?

通过对上述两个概念的理解,我觉得思考这个问题是很容易的。

Java是值传递,没有引用传递。

Java的数据类型分为基本数据类型引用数据类型

  1. 当基本数据类型作为参数传递时,都只是将变量的内容进行浅拷贝给形参,对实参本身是毫无影响的。(可自行根据上述值传递的定义结合实例来判断这句话是否正确)

  2. 当引用数据类型作为参数传递时,引用变量本身存储的是对象的地址,实参将对象的地址传给形参,使形参和实参指向同一个对象

    • 即使在方法中形参通过引用对象使对象的内容发生了改变,但是该对象的地址是不会改变的,那么实参内的值也是不会改变的

    • 即使在方法中形参通过改变指向另外的一个对象,但是原来的那个对象的地址也是不会改变的,那么实参内的值也是不会改变的

      所以综上所述,无论形参在方法中如何改变,实参内的内容都是毫无影响的,所以Java的所有参数传递都是值传递

PS:可能很多人对java存在引用传递感到困惑,极大可能是受c语言指针的影响。看完上述内容后,你再重新对比java对象做参数和c语言指针做参数的区别。

  • java引用做参数,传的是引用实参变量的值(不用在乎这个值是不是地址值),而c语言指针做参数,传的是实参变量自己本身的地址
  • 虽然java引用变量 引用的那个对象可以被修改(达到了和指针同样的效果),但是从定义上来说仍然是值传递,在判断是值传递还是引用传递时,不必将关注点一直盯着那个被引用的对象发生的改变

上文是个人拙见,若有错误,还望积极指正~

Guess you like

Origin blog.csdn.net/qq_51800570/article/details/120784926