课时5:对象引用分析

简介: 我们来进行引用传递分析。大家都知道,类本身属于引用数据类型,既然是引用数据类型,那就涉及到内存的引用传递。内存引用传递其本质可以用一句话概括:同一块堆内存空间能够被不同的栈内存所指向。

课时5:对象引用分析

 

摘要:我们来进行引用传递分析。大家都知道,本身属于引用数据类型,既然是引用数据类型,那就涉及到内存的引用传递。

内存引用传递其本质可以用一句话概括:同一块堆内存空间能够被不同的栈内存所指向。

 

下面来看这样一个程序。这是一个用于引用传递分析的程序。

image.png

我们来看代码,首先是“person per1=new person;”,相信大家对这句代码已经有了共识,有“new”关键字就是开辟空间,而且由于没设置内容,其内容都是默认值,这个过程跟相关代码是一样的,也就是开辟了名为“per1”的空间,大家应该能理解。之后再为其设置内容,最终的结果大家对照着应该也能清楚,就是这样一步步操作的。


准备部分完成后,我们开始后续部分。接下来这句话是最为关键的,那就是“person per2=per1;”,这就是引用传递。“per1”是“person”类型的,“per2”也是“person”类型的,同类型接收是可行的。接着,我们写“per2.h=80;”,代码至此完成,最终的结果就是“张三”和“80”,这里体现的就是引用传递。


image.png

下面我们再来对其做进一步的内存分析,大家认真看代码,代码会一行行往下走,我们按顺序来分析,整个流程和之前分析的形式基本一致,没什么差别。


接着Person per2=per1,这里要明确几点。首先,就像“int x=10;int y=x;”,意味着y的值就是10。同样,per1只是程序里的名字,在底层是通过地址来体现的,per1赋值给per2,那就意味着per2的地址和per1是相同的,也就是二者指向同一个空间。

image.png

当执行“per2.h=80;”时,是per2对这块共享空间进行了修改。这就好比一个人有大名和小名,不管用哪个称呼,指向的都是同一个人,一处改变另一处也受影响,所以最终结果就是“张三”和“80”,这体现的就是引用传递。

image.png

而且,这种引用传递不仅能直接在主方法中定义,也可以通过方法来实现引用传递,毕竟大家都知道方法是可以接收参数的。

我们来看利用方法实现引用传递处理的情况,还是以这个程序为例,代码做了一点改变,

image.png

比如给一个方法传入参数,在方法里进行像change(per)“temper.age=80;”这样的操作,这里与之前最大的差别在于,是将Person类的实例化对象传递到change()方法之中,而实例化对象的本质存的是内存地址。


因为传递的是Person类型,方法接收的也是Person类型,结果依然是“张三”和“80”,它等价于“Person temper=per;”,和之前情况一样。


下面通过内存图来分析,前面几步操作形成的图和之前基本是一样的,无非就是对象名字换了一下,没什么大区别。关键是从第三步开始用到了“change”这个方法,对应的就是处理方法即public static viod change(person temp),按照刚才分析的结果,现在就要开始具体的处理了。


在代码里有主方法和“change”方法这两个部分。主方法里有“per”,“change”方法里有“temper”,它们存的都是地址,这样整个代码的结构就清晰了。

后续进行调用时,相关操作在“change”方法里完成,比如在“change”方法里把对应的“age”(年龄)改成了80。


举个例子来说,程序是有执行单元的。当“temper”和“per”指向同一空间时,如果这个方法执行完毕了,“temper”会断开连接。

image.png

这其实就实现了引用传递,也就是说引用传递可以发生在方法上,这时一定要留意方法的参数类型,也要观察方法的执行过程,对于内存图得学会完整分析,大家要透彻理解才行。

相关文章
|
12月前
|
供应链 搜索推荐 安全
唯品会Vip商品详情 API 接口:开发应用与收益深度剖析
唯品会Vip商品详情API接口,作为电商数据交互的枢纽,提供详尽的商品信息与动态数据,助力开发者、商家及市场分析者洞察市场趋势、优化商品推荐、提升用户体验,从而实现销售额增长、利润空间拓展及用户忠诚度加固,推动电商行业创新发展。
546 16
|
10月前
|
运维 数据挖掘 测试技术
B 端-产品经理 - AxureMost
B端产品经理负责面向企业的产品规划、设计与管理。主要职责包括产品规划与战略制定、需求调研与分析、产品设计与开发、项目管理与推进、产品上线与运营。工作流程涵盖需求收集、产品设计、开发测试、上线推广及运营优化。技能要求包括专业技能、业务理解、沟通协调、数据分析和问题解决能力。
|
机器学习/深度学习 缓存 自然语言处理
阿里云百炼产品月刊【2024年12月】
12月,阿里云百炼带来多项技术革新与服务升级。本月重点包括VL模型部分规格降价,上线多个新模型,如视觉推理模型qvq-72b-preview、多语言文本统一排序模型gte-rerank和人物视频生成模型videoretalk等。应用模块新增音视频互动、互联网搜索及意图选择等功能,极大丰富了应用场景。此外,新增Context Cache功能和batch调用支持,提升了响应速度并降低了费用。
1364 0
|
12月前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
机器学习/深度学习 PyTorch TensorFlow
使用Python实现智能食品质量检测的深度学习模型
使用Python实现智能食品质量检测的深度学习模型
547 1
|
JavaScript 前端开发 索引
JavaScript ES6及后续版本:新增的常用特性与亮点解析
JavaScript ES6及后续版本:新增的常用特性与亮点解析
461 4
|
前端开发 NoSQL Java
聊聊公众号联动扫码登录功能如何实现
大家好,我是V哥。本文介绍了如何通过微信公众号实现扫码登录功能,包括申请权限、生成二维码、用户授权、获取用户信息、建立会话等步骤。假设你已有一个Java后端应用,并完成了微信开发者平台的配置。文中提供了详细的代码示例,帮助你快速实现这一功能。
596 0
|
消息中间件 Linux
Linux IPC(进程间通信)管理:深入解析ipcs和ipcrm命令的用法与示例
在Linux操作系统中,进程间通信(IPC)是实现进程之间数据传递和同步的关键机制。Linux提供了多种IPC方式,如消息队列、信号量和共享内存等。为了优化系统性能与稳定性,及时管理和清理IPC资源非常重要。本文将深入介绍ipcs和ipcrm命令的使用方法,并给出丰富的示例,以帮助读者更好地理解IPC资源管理的实践技巧。
1483 1
|
存储 算法 数据安全/隐私保护
基于SHA-256的大文档加密模块设计与实现
基于SHA-256的大文档加密模块设计与实现
|
存储 Java
G1中region不同区区别
G1中region不同区区别