说起来可笑,本人大四,自以为java基础扎实,想找份实习工作,故去牛客上刷了一些题,差点没把我人抬走了,一开始就遇到这样的题目,如下:
有没有人和我一样的答案:
test okandgbc
这是典型的传值问题,这里我也做了很多测试,先看如下两个测试:
图一
图二
我们都知道,String对象一旦确定就无法更改,其实对于我这种小白来说,这句话挺抽象的,当创建一个String对象时,其实你是创建了一个地址和一个值,这里我们的值是“drh”,首先地址是不可变的,而这里的不可变,其实说的就是我们的值不可变,什么意思呢,就是只要我这个对象的地址不变,我这个值就不可能变化。
值传递
一般情况下,基本数据类型是值传递,而引用数据类型是引用传递,而String不一样。我们这里图一所见,我们把String对象放入有参数的方法中,这里,有参数的方法,其执行的值传递,什么意思,即只是把我们的实参的值传到该方法中,而地址并没有传递,方法会给我创建一个临时代理对象,其值是我们传入的,地址不是,所以当他发生改变时,只是临时对象发生了变化,故我们自己创建的name对象并没有发生变化。
而图二为什么发生了变化,其实这就很好理解,图二可以看作如下:
我只是在我自己的类中修改我自己对象,并不是通过传参的形式。
这里可能就有人会问,不是说String是不可变的吗?其实这里的String对象地址已不是原来的地址,这里的name + " rhj" 创建了新的的对象,然后赋值给了name,这里的name地址和值都发生了改变,早已不是原来的对象!
除了String,Integer等包装类也是如此。
引用传递
StringBuffer/StringBuilder这两者妥妥的引用对象,故是引用传递,所以在方法中传参的时候,连带自己的地址传过去,因为其值是可以更改的,所以这里的值发生了改变!
数组传递也是引用传递,但值得注意的是,在方法中不可以使用=将一个数组赋值给另一个数组,因为这样原始数组就“变了”,地址发生了变化,不可取,引用传递不允许改变地址值。
那么说到这,一开始的题目答案自然见分晓,goodandgbc。



