每次遇到这种问题 本人基本都靠蒙 故特此前来记录
参数传递分为两种类型:基本类型和对象类型
1、基本类型传递时,是传递值的拷贝,原值是不会改变的。
2、对象类型传递时,是把对象在内存中的地址拷贝了一份传给了参数(传址)。
详情看下面的例子:
如图可见:基本类型作为参数进行传递时,传递的是值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的。
再来看当对象作为参数进行传递时的情况:
此时,arr的值被改变了,有人说 对象作为参数进行传递时,传递的是对象的引用,引用被改变了,对象也被改变了,那么带着这个疑问我们来看下面这个例子
看到这个例子的结果,你是不是对引用传递产生了疑惑,其实 在对象作为参数的传递过程中 我们可以这样来理解
StringBuffer arr = new StringBuffer("Hello "); 这行代码执行后,就会在内存堆中生成一个arr对象,如下图所示:
arr里面存放的是对象地址,当将这个对象作为参数进行传值的时候,就会拷贝一份arr的地址传给函数,该地址同arr一样指向Hello,如下图:
这样,当你改变strBuf的值的时候 它指向的是Hello ,Hello也就会随之改变。
但是在Test3中,没有执行 strBuf = new StringBuffer("Hi ");这行代码之前,是跟Test2一样的,但是 strBuf = new StringBuffer("Hi ");这行代码 又重新将strBuf指向了一个新的对象。
如下图:
这时候,strBuf指向的是一个新的对象,再对strBuf进行操作,改变的将会是Hi,而不是原来的Hello了。
所以,当对象类型作为参数传递时,传的是拷贝后的地址。
下面是又一个例子,如果觉得理解了 就来试一下下面的吧