代码改变世界

java参数传递

2019-03-14 16:53  菜码地里的小白  阅读(188)  评论(0编辑  收藏  举报

每次遇到这种问题 本人基本都靠蒙 故特此前来记录

参数传递分为两种类型:基本类型和对象类型

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了。

所以,当对象类型作为参数传递时,传的是拷贝后的地址。

下面是又一个例子,如果觉得理解了 就来试一下下面的吧