java到底有没有引用传递

很多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)朋友给我画的一张图是一样的结论

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36268103/article/details/118335213