首先, 我表示赞同java只有值传递这个说法。为什么我这么认为呢?关于基本类型是值传递大家都没有争议,那么对象呢,对象存在栈中,它的数据存在堆中,这就类似于指针了。例如
classStu stu1=new classStu();
stu2=stu1;
在栈中stu1和stu2是两个位置,但是他们对应堆里面同一块地方,但是
stu2=new classStu();
stu2就会指向堆中一块新开辟的内存,这说明stu2=stu1这只是把堆的地址传递了,是值传递,和引用相当于起别名不同。
关于String对象,String对象改变值的时候会开辟新的内存。
String str="abc";
str="efg";
当str="efg"时,堆里面开辟了新的内存,str指向那个新的内存,而不是在"abc"那个位置改变值。
那要是classStu类里面有一个成员变量是String name 那么只是改变name的值,会在classStu类对象指向一个新开辟的内存吗,答案是不会。因为类对象指向的堆内存关于String name这个字段存的是String name这个对象的栈的地址,这个name对象栈地址存的是String name 值的堆地址。改变name这个字段的值,是在堆开辟了新的内存空间,然后改变name对象这个对象在栈里面存的堆的地址,而classStu类指向的堆则不会影响,因为它只是存了name对象的栈地址。
就像下面我画的那张图说明的:堆中string name对应的内存存的是栈中name对象的地址。name对象改变值,由李明改成了张三,那么栈里面存的就由423变成了486,但是789这个地方存的还是123。
示例图
网友评论