引用还是传值——被打脸后才发现多年的理解是错的

article/2025/11/9 18:43:28

这是一个很基础的问题,如果你已经理解透彻了,其实可以不需要往下看(如果理解没错的话),因为相信你已经知道了答案,本篇主要是解释给和我一样一直以来有这样误解的人,事实上这是一个简单的问题,之所以会陷入这个误区,主要还是因为习惯了高级语言后,特别是屏蔽了指针感知后,多年来“口口相传”导致的误解

起因是:

关于 dart 在函数里究竟是引用还是传值,到 java 在方法里是引用还是传值?

其实结论也很简单,不管是 dart 和 java ,在正统意义上理解,都是值传递。 等下,是不是这时候有些人就开始质疑了:“就这”?

不急,有兴趣的可以往下看,先说正统意义上的理解,如下示例1代码所示,这就是正统意义上传递还是引用的最直观示例:

///示例1public static class People {public String name;People(String name) {this.name = name;}
}public static void main(String[] args) {People a = new People("111");changePeople(a);System.out.println("print " + a.name);
}public static void changePeople(People p) {p = new People("222");
}

如上代码,如果是真正意义上的引用传递,那么打印出来的应该是 "print 222" ,但是事实上运行后打印出来的是 "print 111"

如果你觉得这样不对,那就是和我以前一样理解错误的话,那肯定会举这样的例子,如下示例2所示:

///示例2public static class People {public String name;People(String name) {this.name = name;}
}public static void main(String[] args) {People a = new People("111");System.out.println("print a hash " + a.hashCode());changePeople(a);System.out.println("print " + a.name);
}public static void changePeople(People p) {System.out.println("print p hash " + p.hashCode());p.name  = "222";
}

运行之后的结果是:

I/System.out: print a hash 240863055
I/System.out: print p hash 240863055
I/System.out: print 222

分明 ap 不就是一个地址吗?打印之后 aname 不也变成了 222 了吗? 从这个角度理解看起来好像真的就是引用传递!但是可惜这并不是,这是一种误解。

其实这里的问题主要出在讨论的角度出现了问题:

  • 示例 1 正统上大家说的引用传递是对于变量对象的角度;
  • 示例 2 讨论的引用还是传递是以值的角度;

知乎的这个例子举的就特别有意思,以它的例子为模板:

  • 你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。、

  • 你有一把钥匙,当你的朋友想要去你家的时候,如果你复制了你的钥匙给他,这就是值传递。这种情况下,如果他对他钥匙做了什么事情,都和你的钥匙无关。

  • 最后按照示例2的角度代入这个故事,你的朋友拿着你给他的钥匙,进到你的家里,把你家的电视砸了,你再用你的钥匙开门进去,看到的也是被砸了的家,这就是示例2中的 p.name 赋值的类比。

所以示例2其实就是如上图的一个状态,其实 a 传递进去 changePeople 之后,在 changePeople 里的 p 已经是另外一个地址,而不是传递的 a 的地址 ,所以并不是传统意义上的引用传递,而我们打印出来的一致的 hashCode ,其实就是值 People 的地址和引用。

这个结论在 java 和 dart 里都是一致的,而我也是被 js 的同学所打脸,所以在函数上 java、dart、js 这些高级语言的设计都是如此。

我思考了下,从值的角度导致误解出现的原因,其实应该归结于高级语言里屏蔽了指针等的底层概念:

首先在 java、 dart 函数里讨论对象的传递引用意义不大,因为不能被操作的引用对象没意义,如果引用对象不被赋值给变量,它就会被GC,所以最终都关注到“值”本身。

所以作为操作不了对象引用的语言,讨论引用传递确实没有意义,从而导致大家把值和对象关系搞混了~当然,如果你也有什么想法或者理解,欢迎评论交流。


http://chatgpt.dhexx.cn/article/8JjpWOOW.shtml

相关文章

一个页面同时请求多个接口,超过6个请求之后,stallled时间过长

Network Timing 使用Chrome浏览器请求多个接口时发现前面的请求Network Timing中stalled时间明显较短,到第四个请求时stalled时间开始加长,超过6个请求之后,stallled时间过长,导致接口整体请求时间变长,页面渲染变慢。…

疫情期间再读三体——读后感

最近疫情持续的时间有点长,感觉在家挺无聊的,正好《我的三体--章北海传》完结了,这部动画真的是圆了三体迷的重现三体书中的场景和意境的的一个梦想。章北海是书中的一个重要人物,也是当前这部动漫的主角,他为人类文明…

实验十七 VLAN间的三层通信

实验十七 VLAN间的三层通信 配置要求: 通过三层交换机实现VLAN间互通 通过单臂路由实现VLAN间互通 网络拓扑图: 操作步骤: 一、 通过三层交换机实现VLAN间互通 1、配置交换机LSW1的接口为trunk接口,g0/0/1口允许vlan 10通过&#…

科幻小说《三体》读书笔记范文解读

科幻小说《三体》读书笔记范文解读: 《三体》这本书如雷贯耳了很久很久,只是听很多人说,文科生读不懂这本书,畏难情绪作祟,让我一直下不定决心来啃这块硬骨头。直到去年,朋友阿特说他买了这套书闲置在一边&…

DTI-ATS入门(2):DTI协议纵览

本文来自自学过程中所记的笔记,可能有不少错漏与胡言乱语,仅供参考,建议主要以ARM官方文件进行参考。原参考文档官网可下载,为了方便各位,我也上传了,需要的自取; 链接:https://pan.baidu.com/s…

讯飞星火_VS_文心一言

获得讯飞星火认知大模型体验授权,第一时间来测试一下效果,使用申请手机号登录后,需要同意讯飞SparkDesk体验规则,如下图所示: 同意之后就可以进行体验了,界面如下: 讯飞星火效果体验 以下Promp…

你可能不知道的看片方式

目录 操作教程 操作教程 进入360极速浏览器的扩展中心 下载插件进入网站找到插件并下载安装进入管理面板运行脚本随意阅片 少侠别走 如果某天不行了,就更新一下脚本 你的赞与收藏对我很重要 System.out.println("我选择滑稽取宠");

科研不知娱乐滋味了,找找美剧看看

英文名:《CSI》 中文名:《犯罪现场调查》 推荐值:★★★★★ 首播时间:2000年10月06日 《犯罪现场调查》作为目前为数不多的老牌剧集,自2000年10月在美国CBS电视网首播,便立刻受到了观众的追捧,如今每周都有过千万的观众等着观看CSI们如何通过蛛丝马迹破解一个个谜案…

吴佳琳の爱宠大机密「原创歌曲我家有只《小笨蛋》」

气温回暖,柳絮飘飘, 真想感叹一句,这个寒冬终于即将过去了, 也迎来了春暖花开的好时节。 春日里琳大侠最讨厌的事情, 大概就是家里养的比熊小可爱——毛球 老是掉一地毛吧! 每次新衣服上都会粘着毛球的头发丝儿。 而家里的地上床上也都是她的小玩具和掉落的毛发。 琳大侠…

主人给狗狗扔零食,小狗无奈吐槽,教你制作搞笑配音短视频

主人给狗狗扔零食,小狗无奈吐槽,教你制作搞笑配音短视频 有时候,为自家的毛孩子拍摄了一段有趣的短视频之后,我们其实还可以尝试为它们配音,不仅可以让整个短视频更加的有趣,而且也更容易吸引粉丝&#xf…

圣诞氛围拉满,《小鬼当家》原版取景地首次对外开放入住

北京2021年12月2日 /美通社/ -- 步入圣诞月,热闹温馨的节日氛围变得更为浓厚。在许多人的童年记忆中,《小鬼当家》主人公在圣诞夜与窃贼斗智斗勇的经典桥段给大家带来了许多欢笑与感动。在清脆的圣诞铃声已然敲响的12月,Airbnb爱彼迎邀房客梦…

最近很火的配音软件|绝不允许有人错过这样的宝藏工具

最近各大短视频平台,出现了各种各样自然且情感丰富的配音。很多朋友非常好奇,自己刷到好几个博主,用的都是这个声音,难道找的都是一个配音员吗? 当然不是!其实啊,这些自然又富有情感的声音&…

英超体育fun.乐联赛 纽卡斯尔对战伯恩茅斯 伤病太多 纽卡很难

因女王逝世英超等多场体育fun.乐联赛延后,终于上周的英超联赛在9月17日准备开赛了。晚上22:00纽卡斯尔联对战伯恩茅斯,两队积分差不多,但是战绩不一样,纽卡斯尔联平局多,所以两队的大体情况不同,把么最终结果如何,且看分析。 纽卡斯尔的“钞能力”大家众所周知,但所引援的球星不…

有哪些你看过五遍以上的电影?

​作为一个热衷于看爱情电影的妹子,这8部爱情电影我看了五遍以上! 1. 《他其实没那么喜欢你》 剧情简介: GiGi是个对爱情充满幻想的女孩,却在一次次约会中受挫。她的闺蜜Beth和Janine不断鼓励GiGi在感情中振奋起来,却各自对爱情怀有遗憾。 几个女孩带着爱情的梦想在城…

讲一讲这几天一群朋友玩的考察眼神小游戏

首先,我们为了方便做事情,就把文件保存到本地双击index.html即可打开 开始游戏后在正方形点击右键检查元素 可以看到一共有四个格子相对应四个RGB(RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变…

《狂飙》台词“老默我想吃鱼了”被抢注商标

《狂飙》台词“老默我想吃鱼了”被抢注商标,#老默我想吃鱼了被抢注商标 #老默我想吃鱼了 #告诉老默我想吃鱼了 #商标被抢注 #狂飙 老默我想吃鱼了被抢注商标 近期,电视剧《狂飙》爆火,剧中许多经典台词引人回味。一句“告诉老默,我…

推荐《我是谁 – 没有绝对安全的系统》CLAY——Clown Laughing At You「小丑的嘲笑」

导演:巴伦博欧达尔 ---------强烈安利《我是谁:没有绝对安全的系统》--------- 黑客。一个比程序员更加稀有,在互联网上更加神秘的群体。在平常人眼中,他们好像就是互联网上无所不能的存在,个人的PC电脑,…

看了 4K 经典中视频,我才知道 30 多年前的艺术家有多牛

作者 | 宋慧 出品 | AI科技大本营 提起童年记忆的国漫经典,你会想到哪一部?几十年前,水墨动画《小蝌蚪找妈妈》、手绘风《哪吒闹海》、木偶片《阿凡提》、剪纸艺术《葫芦兄弟》……这些老国产动画片,艺术风格千姿百态&#xff0c…