求问Java的值传递和引用传递??

今天试验了一个例子想要证明Java只有值传递但是没有引用传递,代码如下

class cat{
    public int age;
    public String name;
    public cat(){
        this.age = 0;
        this.name = "haha";
    }
    public void setAge(int age){
        this.age = age;
    }
}
public class test {
    public static void main(String[] args) {
        cat cat1 = new cat();
        s1(cat1);
        System.out.println(cat1.age);
    }
    public static void s1(cat c){
        c.age=2;
    }
}

然后输出的年龄值为2,这貌似就是引用传递,然而搜索了知乎得到了下图,据楼主解释这种属于值传递,但是他传的是引用地址值的拷贝??只不过原对象和副本指向的那个值内存块相同(这不就是引用传递的定义吗??)。那这种值传递和引用传递有啥区别??

然后又看了一个知乎帖子,想要用这段代码来证明不是引用传递,代码如下:

  private static void change(Student stu1) {
        stu1 = new Student();
   		 stu1.setAge(99);
    }

传入的stu1原本年龄是12,走了这个函数之后年龄没改,楼主的意思是如果是引用传递的话值应该被修改,当时有点蒙比,于是打开C++,写了这段代码,我可以保证这段C++肯定是引用传递:

void seti(int *p) {
	p = (int*)malloc(sizeof(int));
	*p = 2;
}
int main(void) {
	int h = 1;
	int *p = &h;
	seti(p);
	printf("%d", *p);
}

结果p的值是1,后来才发现引用传递在函数里面不会改变原本的指向

附上值传递和引用传递的定义(应该是对的吧)

所以这两个帖子都不能很好的说明Java没有引用传递,我甚至觉得这两个帖子是在证明Java有引用传递(才疏学浅不喜勿喷本人玻璃心呜呜)

所以想问问大家Java的值传递应该怎么理解??就是像第一个帖子说的一样要把引用传递理解成地址值的拷贝??

上述两个帖子按照先后顺序如下:

[1].https://zhuanlan.zhihu.com/p/388486387

[2].https://zhuanlan.zhihu.com/p/104371706

#互联网没坑了,还能去哪里?#
全部评论
确实这是个一直不理解的点
点赞 回复 分享
发布于 2024-02-24 23:46 广东
Java是值传递,只不过传的的引用类型
点赞 回复 分享
发布于 2024-02-24 21:27 北京

相关推荐

04-29 19:56
已编辑
杭州电子科技大学 Java
面试前一天打电话的时候就感觉面试官人很好了(额,因为我官网邮箱填错了,所以不知道啥岗位,官网全是筛选阶段)1.自我介绍起手2.诶,你自我介绍这个比赛项目我挺感兴趣的,你说说你当时负责的大模型模块吧3.你们当时如何去优化大模型然后提高输出结果质量的呢?(先是说了一嘴24年4月前,大模型各种应用开发可能没有很广泛普及,所以只能是prompt过程,然后现在我确实了解不多,只能靠自己的理解和线下同学吹水的收获讲了以前怎么优化,现在优化思路是什么)4.你这个视频平台项目背景?(同学分模块合作搞毕设)5.说说你的负责的模块吧(就讲了点赞,搜索,视频模块,从技术选型,然后各种网上冲浪,偶然发现一些视频平台点赞延迟性,进而优化自己的项目)5.1 你这个门面模式说说?5.2 你还了解什么设计模式?提了最经典的单例,然后就是问有哪些类型单例,怎么个样6.你这个第二个简历项目,说说RPC和HTTP区别吧(直接起手瑞士军刀和手术刀的区别,一个是迎合万维网,另一个是内网小圈子使用)7.我看你刚刚没有提到第一个项目的视频上传模块,我看你用了RabbitMQ,说说怎么用的?(先说了从Java原生队列到Redis到MQ三幻神选型,后续因为各种实践问题,模仿操作系统CPU多级调度队列算法实现)8.你了解MQ消息丢失原因嘛?还有拒绝方案(吟唱阶段?)9.好了项目方面差不多,问问你是怎么去做SQL优化的(Explain啊,多人协作修改索引,但是业务没改啊之类的)10.出了一道SQLselect a,b,c, d from table where a=1 and b>10 and c=2,现有索引(a,b,c)如何优化?(直接先说常用引擎以及常用索引数据结构,然后阿巴阿巴,加上优化器原因,ac在b前面就行了,d在最后保证覆盖索引)11. 你对排序的学习以及认知?(直接On^2到On说了下,然后说为什么大部分高级语言使用 快排作为库函数C++内省快排,Go的三路,Java的双轴以及Java在对象排序时使用插入和归并。12. 手撕 第K大元素先是讲思路,可以用小顶堆但是只能nlogn但是这个场景下用快排可以On然后开撕(悲,最痛苦的一集,最后写出来调试半天还是错的,面试官安慰没事,思路他都知道了,可能细节没处理好)丫的面试完才想起来,我写的时候快排是从小到大啊,第K大是倒数第K个,不是正数第K,日内瓦13.问了问到岗时间和实习时长呜呜呜求求了,让我成为团孝子吧,四月份丫的只有一个面试,差点破防了
查看13道真题和解析
点赞 评论 收藏
分享
05-19 12:10
已编辑
门头沟学院 Java
面试官提问环节:1.   自我介绍2.   项目中的难点(个人项目3d建模相关)3.   3d大规模渲染是很花时间的,如何优化4.   如何快速查找一百万条数据的某一个数据(提示我建立索引)5.   介绍第二个项目(爬虫相关)6.   你了解哪些反爬虫机制7.   HTTP常见的请求头有哪些、作用是什么8.   数组和链表的区别(我没答到点子上)9.   我有一个一百万的数据,用数组还是链表10. 如果我只有一台电脑,我要清洗一百万条数据,如何清洗,不要说换好电脑这种方案11. 手撕链表(我没撕出来,最后面试官让我说思路,我说完思路我马上就撕出来了,不过已经结束了)反问环节:Q.   面试官你觉得我有哪些地方可以提升呢?A.   基础知识不扎实,可以多提升自己的基础知识,我有一个我的个人博客,面试官真的点进了我的个人博客去看,给我提出建议,内容应该更加细节,更加丰满,当时听到面试官点进了我的博客,我可以说非常激动总结:本次面试,面试官一直提示我索引,我感觉他可能真的想引导我答出来,但是我不争气,我是个撒比,我说新建一张表,然后再用联合索引,我真的是个撒比,我感觉当时面试官听到这个答案心里都凉了,一直说嗯好吧,我知道了,然后就是数组和链表的区别,他也是提示我,我才回答出来的。八股文几乎可以说是一点没问,我背那么久八股文几乎一点没考,我是万万没想到考的是数组和链表的区别,希望其他人可以借鉴我这个好好加油准备,祝大家好运,我基本上夏季面试没希望了
腾讯一面1904人在聊 查看24道真题和解析
点赞 评论 收藏
分享
05-11 22:33
已编辑
济宁职业技术学院 Java
更新:4.27一二面,4.28 oc,5.11 offer-项目:1. 库存扣减的滑块锁怎么设计的2. 怎么保证数据库一致性的3. es如何实现两个表聚合查询?4. 日志采集怎么实现的-手撕:   快排。面试官问了快排的思路、快排时间复杂度最高时的情况、快排是否稳定。-八股:1. 用户态和内核态的区别2. 用户态怎么切换到内核态3. 线程和进程的区别4. 进程之间如何通信(帖主已汗流浃背,请求面试官不要问os了)5. 讲一下jvm内存模型6. synchronized了解吗7. 偏向锁和轻量级锁的区别8. ArrayList和LinkedList的区别9. ArrayList线程安全吗?如果不安全,那该用什么?10. 对不可变类写时复制的理解11. CopyOnWriteArrayList有什么缺点?12. MySQL索引分类13. InnoDB和MyISAM执行语句哪个快?14. 索引失效的情况15. MySQL三种日志的作用-杂谈   面完后5分钟约二面,有没答上来的问题,面试官也给过了。二面30min没啥好说的,手撕是二叉树的右视图。   大半夜睡不着,遂写。找工作前路渺渺茫茫,每天都尽力把自己哄好,第二天清晨又会过早地醒来,再也无法合上眼睛。我惴惴不安的心在无止境地受罚,好像我杀了人一样。   每天睁眼醒来,都是一场与这个世界的殊死搏斗。天真的逻辑被社会现实狠狠击碎后,更难相信任何奇迹与美梦。或许希望会在明日如期而至,又或许我的前路是早被写定的漆黑一片。而今日的我对此一无所知,惶惶不可终日。   一切都无法预测,一切都不在我的掌握之中,连同我自己。唯一能做的,也只有持续思考与学习,不要停 
null努力了:一面问了很多所以二面才不怎么问,跟我当时情况一样,手撕没问题基本就稳
滴滴开奖152人在聊 查看44道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务