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++有显式的指针操作) 来探讨这个问题

摘要:c++ string在重新赋值后 地址并未发生改变 (java中是重新开辟空间) 特此验证

在这里插入图片描述

为什么用指针传递? People p = new People(); 其对应的c++写法是 People *p = new People();
*p 为指针; 指针存着地址变量, 为了简化 使用string 指针传递来验证;

正题开始: 可以看到这个例子和开头我们的java例子是一样的,在执行完test后 指针地址又恢复了 ,但是在test方法里面是变更的,那是因为复制了一份指针 对复制这份进行操作,也正是值传递

而具体的内存变化 根据我的一个 c++大佬(cai ji)朋友说,指针传递压栈了 从堆内存复制一份到栈内存了

在这里插入图片描述

首先定义一个变量 str 值为"a" , &str中的&是取址符, 所以&str是str的地址,
即 *strPoint 指针 存着str的地址,也可以通俗点理解为strPoint就是存着str的地址 ,
从我们的输出结果也可以发现 变量a地址(&str)和a指针变量(strPoint)输出是一样的。

当然 *strPoint 指针本身作为一个变量,它也是有地址的,所以&strPoint输出的就是这个指针的地址,

接下来我们调用了test方法,传递的是指针,为什么传递的是指针 :

上面说到, People p = new People(); 其对应的c++写法是 People *p = new People();
(本文为了简化 用string代替对象 )
在java中 我们传递的是p ,所以相应的 c++传递的就是指针了。

我们可以看到 在test方法内部,指针地址是变化的,但是在结束后,*strPoint 是不会变的,那么说明
test方法里面是一份副本,副本指向了新的地址,但是原来的指针指向未发生改变,
所以指针传递是值传递,从而推出我们java传递只有值传递。

值传递引用传递一直是个很大的争论,很多人只是看到java核心技术里面的一句java只有值传递,却未深究原因,
当然本文也不一定保证完全正确,但逻辑上看着好像确实是这么回事,比网上大部分举例有说服力些,
如有错误或争论点,欢迎提出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟秋与你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值