很多java初学者应该都在书上看过一句话:java只有值传递
但是可能又会遇到java面试题:谈谈值传递和引用传递的区别
或者随着自己正式开发,发现好像确实有引用传递
文章供参考及自己复习 java里面到底是引用传递还是值传递
结论:值传递
先看一个某乎上的例子:
简化一下 伪代码就是:
main{
People p1 = new People();
p1.setName("zs");
test(p1);
}
test(People p ){
p = new People();}
文中是以这个例子 p1最终没有改变 来说明是值传递的,但是这个例子并不能说服我 指针都指向了不同的地方;
于是花了一点时间 复习(xue xi)c++基本语法, 从c++的角度(因为c++有显式的指针操作) 来探讨这个问题
摘要: string在重新赋值后 地址并未发生改变 (因为java中是重新开辟空间 特此验证)
为什么用指针传递? People p = new People(); 其对应的c++写法是 People *p = new People();
*p 为指针; 指针存着地址变量, 为了简化 使用string 指针传递来验证;
正题开始: 可以看到这个例子和开头我们的java例子是一样的,在执行完test后 指针地址又恢复了 ,但是在test方法里面是变更的,那是因为复制了一份指针 对复制这份进行操作,也正是值传递
而具体的内存变化 根据我的一个 c++大佬(cai ji)朋友说,指针传递压栈了 从堆内存复制一份到栈内存了
注意:c++ main方法中 str都在堆内存 所以把test内容写在main方法中 会有不一样的结果,而这个结果和我的大佬(cai ji)朋友给我画的一张图是一样的结论