java的值传递

我们先来看个例子


运行结果:


int很容易理解,因为int是基础类型之一,传递的是int的一个副本,所以i的值并没有被改变;

但是String难道不是对象吗?为什么和StringBuffer的效果不一样?让我们debug一下:


运行到这一步时,str的内存地址是@534,对str重新赋值后:


内存地址变为@536,继续执行:


main方法里,str的地址仍然为@534;

我们继续看passStringBuffer方法:




可以看到,append方法没有改变Stringbuffer的地址,sb = new StringBuffer时,地址从539变为了551,所以打印出来的结果是passStringBuffer而不是newStringBuffer;


结论:

1.因为String是不可变的,所以str = “passString”这一步操作,实际上,是在常量池新建了一个值为passString的新的String对象,并将str 指向这个对象, 而main方法里的str指向的任然是常量池里的 “testPassString”;

2.StringBuffer是可变的,所以sb.append("passStrtingBuffer")并没有生成新的对象,而sb = new StringBuffer("newStringBuffer");在堆里生成了一个新的对象,并将sb指向这个对象,而main方法指向的是原来的地址;