很长一段时间里,我也没有弄清楚到底是传值还是传引用的,而且网上很多博客的说法不一样,还有很多都是错误的,误导人的。
下面运行几个例子,来说明到底是传值,还是传引用。
基本类型:

运行结果:

从上面的截图可以看出来,是将变量a的地址传给了change方法的,并且在change方法中,是改变了变量地址。然后外面方法中的变量a的地址并没有变,值也没有变。
对象类型

运行结果:

从上面的结果可以看出,基本的表象是和基本类型没有区别的。
只改变对象的属性

运行结果:

这次的运行结果和上面两个不一样了。
总结上面的三个例子可以看出来,change方法都是接收到了传递过来的变量的引用。并且在第一和第二个例子中没有改变掉原对象的引用。我们可以这样理解,在调用change方法的时候,是将原变量的引用传递给了change方法的参数,在第一和第二个例子中通过赋值改变了方法参数(可以理解为实参)的引用,但是并没有改变原变量的引用。在第三个例子中,由于改变的只是方法参数(可以理解为实参)的引用对象的属性的引用,同样的没有改变原变量的引用,因此方法参数和原变量所指向的还是同一个对象,当在change方法里面改变对象的属性时,change方法外部是知道的。
如有理解不对的地方,还望读者留言告之。
网友评论