Java 中的值传递和引用传递区别
值传递和引用传递的理解
Java中数据类型分为两大类,基本类型和对象类型。
相应的,变量也有两种类型:基本类型和引用类型。基本类型的变量保存原始值,即它代表的值就是数值本身;
而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,
对象本身存放在这个引用值所表示的地址的位置。
基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress,
引用类型包括:类类型,接口类型和数组。
在java中,调用一个方法时,如果传入的是基本类型的参数,那么这就是值传递过程。如果传入的是引用类型,那么这就是一个引用传递过程。
两者之间的主要区别
在值传递中,因为参数是基本类型,所以它本身就代表着内存中实际的值,值传递过程就是把参数在内存中的值复制一下,相当于一个副本。在方法中,这个值做任意改变,都不会影响原先的本体。而在引用传递中,参数是引用类型,参数的值实际上是一个地址,用来指向内存中具体的内容。引用传递过程会把这个参数(地址)
复制一下,当做一个副本,但是这个具体的值(地址)指向的还是原先的内存中的内容,所以当对这个参数做任意修改时,会影响原先的本体。
在实际工作中经常容易忘记而犯错的点
在复杂的业务中,一个类中经常包含很多方法,在某些方法里面,原本只是想模拟验证一下数据的格式和一些计算,但是因为是引用传递,导致模拟的动作修改了对象的本体,导致无形中修改了业务数据,产生反反复复的bug。