Icebound

icebound-area

学习java时的小思考

写java的时候遇到一点小问题,关于方法(函数)传值还是传址的问题。

比如下面一段代码:输出结果为abc

这段代码新建了一个OnlyTest对象,并且向构造函数传入str。随后main函数修改str中的内容,最后输出ot对象的t成员。按我们以前的理解,构造函数传入了str的地址,讲道理如果str改变了,ot.t也应该改变才对啊?为什么没有改变呢?

再看下一段代码:输出结果为lty

这个代码更加复杂,no对象作为参数传入ot的构造函数,随后no对象的成员被修改,而ot中的t成员也一并被修改了??为什么之前那段代码没有被修改,而这里被修改了呢?

(解释的不太清楚,自己看代码吧。。)

这是因为java所有函数均为传值,没有传址,而且传值时会进行拷贝。为了好理解,我们把java去掉的指针加回来。

考虑第一段代码,在调用onlytest的构造函数时,实际上时对指针进行了传值!拷贝了一遍指针,如下图所示:

1-1

随后ot.t指向了”abc”。然后如果我们对str进行操作,无非就是让str由指向”abc”变为指向”lty”而已,并不会改变ot。而一开始作为构造函数参数的str拷贝被回收。如下图所示:

1-2

现在来看第二份代码。第二份代码一开始用构造函数传入一个对象完成了对ot的初始化,这个过程中也都是进行了复制指针传值的操作,ot的成员t实际上指向了no指向的对象!如下图所示:

2-1

随后我们调用fun函数,对no进行复制传值,然后no的成员name发生了改变!因为ot.t的指向与no的指向相同,所以ot.t也发生了改变!(其实并不知道”obj”会不会被回收。。)

2-2

相信我不用多说,用这四张图就能搞懂传参的原理了。。

java真烦。。溜了。。感谢fs同学提供ipad pro供我绘图。。。