当前位置: 首页 > article >正文

值传递和引用传递辨析

在正式拆解前先明确一个核心前提值传递与引用传递的本质区别在于函数调用时传递的是参数的副本还是参数本身的引用与具体的数据类型基本类型、引用类型无关——这是多数开发者陷入误区的关键很多人误以为“传递基本类型就是值传递传递对象就是引用传递”其实这是错误的认知。一、核心定义一文分清值传递与引用传递要分清两者首先要掌握它们的严格定义这是判断的唯一标准结合内存逻辑理解会更清晰这里以主流语言Java、C/C为例兼顾通用性。1. 值传递Pass by Value传递“副本”互不干扰值传递的核心逻辑函数调用时编译器会创建原参数的一份“副本”将这份副本传递给函数的形参函数内部对形参的所有修改仅作用于这个副本不会影响函数外部原参数的值。简单来说就是“你给我一份复印件我修改复印件不会影响你的原件”。其核心特征的是原参数与形参相互独立拥有各自的内存空间修改形参不会牵连原参数。这种传递方式的优势的是安全能有效保护原始数据不被意外修改适用于小型数据如基本类型或需要保护原始数据的场景。2. 引用传递Pass by Reference传递“别名”牵一发而动全身引用传递的核心逻辑函数调用时不会创建原参数的副本而是将原参数本身的引用相当于“别名”直接传递给形参函数内部对形参的修改本质是通过引用直接操作外部原参数会直接影响原参数的值。简单来说就是“你把原件给我我修改原件你的原件会直接发生变化”。其核心特征的是形参与原参数指向同一块内存空间两者是“一体两面”修改形参就等同于修改原参数。这种传递方式的优势是高效无需复制数据尤其适合大型对象但风险也随之而来——若不小心修改形参会意外改变原始数据需格外谨慎。二、关键误区这些坑90%的开发者都踩过理清定义后我们重点解决最常见的认知误区尤其是Java开发者容易混淆的点——很多人认为“Java中传递基本类型是值传递传递对象是引用传递”但事实并非如此。误区1传递引用类型 引用传递这是最核心的误区。以Java为例Java语言仅支持值传递不存在真正的引用传递——即使传递的是对象引用类型传递的也不是原对象的引用本身而是“引用地址的副本”。我们用Java代码拆解这个逻辑分两种场景说明// 场景1修改引用对象的属性看似影响原对象实则仍是值传递 class User { private String name; private Integer age; public User(String name, Integer age) { this.name name; this.age age; } // getter、setter、toString省略 } public class PassDemo { // 修改引用对象的属性 public static void modifyObjectProperty(User user) { // user是原对象引用地址的副本与原对象指向同一块堆内存 user.setAge(30); // 通过副本地址修改堆内存中对象的属性 System.out.println(函数内部 user); // 输出User{name张三, age30} } public static void main(String[] args) { User user new User(张三, 20); modifyObjectProperty(user); // 传递引用地址的副本 System.out.println(函数外部 user); // 输出User{name张三, age30} } }很多人看到外部对象的属性被修改就误以为是引用传递但本质是传递的是“引用地址的副本”这个副本和原引用指向同一块堆内存因此修改对象属性时会影响原对象但如果修改的是形参的引用指向比如重新new一个对象就不会影响原对象这也印证了Java是值传递// 场景2修改形参的引用指向不影响原对象 public static void modifyReferencePoint(User user) { // 修改形参的引用指向仅作用于副本与原引用无关 user new User(李四, 25); System.out.println(函数内部 user); // 输出User{name李四, age25} } public static void main(String[] args) { User user new User(张三, 20); modifyReferencePoint(user); System.out.println(函数外部 user); // 输出User{name张三, age20}原对象未变 }误区2指针传递 引用传递在C/C中很多人会将指针传递与引用传递混淆但两者本质不同。指针传递本质上也是值传递——传递的是指针变量的副本即地址的副本只是这个副本指向原参数的内存地址而引用传递传递的是原参数的别名没有副本形参和原参数完全等价。简单区分指针可以为null引用不能为null指针可以重新指向其他地址引用一旦绑定原参数就无法更改指向。三、实战总结什么时候用值传递什么时候用引用传递结合开发场景给大家明确两种传递方式的适用场景避免踩坑的同时提升代码效率值传递适用场景传递基本数据类型int、float、boolean等、小型结构体需要保护原始数据避免被函数内部意外修改传递不可变对象如Java中的String——即使传递的是引用地址的副本也无法修改原对象本身。引用传递适用场景传递大型对象如自定义类、数组避免复制数据带来的内存开销需要在函数内部修改原参数的值或对象属性如C中的引用、Python中的可变对象追求代码效率且能保证对形参的修改是预期内的。补充不同语言对两种传递方式的支持不同核心区别如下表格清晰对比便于记忆语言值传递引用传递特殊说明Java支持基本类型引用地址副本不支持仅值传递引用类型传递的是地址副本C支持支持用声明引用同时支持值传递、引用传递、指针传递Python支持不可变对象支持可变对象可变对象列表、字典本质是引用传递不可变对象是值传递

相关文章:

值传递和引用传递辨析

在正式拆解前,先明确一个核心前提:值传递与引用传递的本质区别,在于函数调用时,传递的是参数的副本还是参数本身的引用,与具体的数据类型(基本类型、引用类型)无关——这是多数开发者陷入误区的…...

嵌入式软件架构设计:资源约束与实时性驱动的工程实践

1. 嵌入式软件架构设计:面向工程实践的系统性方法嵌入式系统开发中,软件架构并非大型服务器应用的专属概念,而是贯穿产品全生命周期的核心工程能力。当一个基于STM32F407的电机控制器需要在50μs内完成电流环闭环运算,同时支撑CAN…...

科哥cv_unet图像抠图WebUI:一键批量抠图,电商设计效率翻倍

科哥cv_unet图像抠图WebUI:一键批量抠图,电商设计效率翻倍 1. 产品概述与核心价值 科哥cv_unet_image-matting是一款基于U-Net架构的智能抠图工具,经过WebUI二次开发后,实现了简单易用的图形化操作界面。该工具专为解决电商设计…...

为什么现代网络离不开MPLS?深入解析标签交换与IP转发的性能差异

为什么现代网络离不开MPLS?深入解析标签交换与IP转发的性能差异 在当今数据爆炸式增长的时代,网络性能优化已成为企业和技术团队必须面对的挑战。想象一下,当数百万用户同时访问在线服务时,毫秒级的延迟差异就可能影响用户体验甚至…...

QGIS地图下载避坑指南:如何用XYZ Tiles精准导出0.3米分辨率地图(附CRS设置技巧)

QGIS高精度地图下载实战:从XYZ Tiles配置到0.3米级分辨率输出的完整方案 当城市规划师需要在老旧城区改造项目中获取0.3米精度的底图时,或者测绘工程师要为基础设施项目准备高分辨率参考影像时,QGIS配合XYZ Tiles的解决方案往往能提供专业级的…...

Edge浏览器安装Vue DevTools保姆级教程(含常见问题解决)

Edge浏览器安装Vue DevTools:从零到精通的完整指南与疑难排解 如果你刚开始接触Vue.js,看着浏览器控制台里那些陌生的Vue组件树和数据流,是不是感觉有点无从下手?别担心,这几乎是每个Vue开发者的必经之路。调试工具就像…...

Sigmastar平台_宽动态参数优化与运动区域处理技巧

1. Sigmastar平台宽动态技术基础 第一次接触Sigmastar平台的宽动态功能时,我被它复杂的参数体系弄得一头雾水。经过几个项目的实战,我发现只要掌握几个核心概念,就能快速上手。宽动态(WDR)技术的本质是通过长短帧曝光合…...

Boss直聘爬虫进阶:如何用Selenium无头模式+动态URL绕过反爬(Python3.8实测)

Boss直聘数据采集实战:Selenium无头模式与动态URL策略深度解析 在招聘市场数据分析领域,获取高质量的职位信息是许多研究者和企业决策者的核心需求。本文将分享一套经过实战检验的技术方案,通过Python 3.8环境下的Selenium高级应用&#xff0…...

从零搭建一个AUTOSAR软件组件:手把手教你定义和使用AUTOSAR接口(含ARXML配置)

从零搭建AUTOSAR软件组件:实战ARXML接口配置与RTE集成 在汽车电子架构快速迭代的今天,AUTOSAR已成为嵌入式软件开发的事实标准。但许多工程师在理论学习后,面对实际工具链操作时仍会感到无从下手。本文将使用Vector DaVinci工具套件&#xff…...

8D分析总做形式化报告?一文吃透问题根治的标准化闭环

在企业日常运营,尤其是生产制造、质量管理、现场改善工作中,各类重复性问题、突发性异常、批量性缺陷始终是制约效率与品质的核心障碍。很多企业面对问题时,往往陷入头痛医头、脚痛医脚的被动局面,要么仅凭经验仓促处理&#xff0…...

Vue3实战:高德地图离线化部署全攻略——从瓦片下载到内网集成

1. 为什么需要高德地图离线化部署? 最近在做一个政府单位的内部GIS系统项目时,遇到了一个棘手的问题:他们的办公环境是完全隔离的内网,但业务又必须使用地图功能。这让我不得不深入研究高德地图的离线化部署方案,今天就…...

小米手机无障碍服务总弹窗?一招教你隐藏SelectToSpeakService的提示文字

小米手机无障碍服务弹窗优化指南:SelectToSpeakService提示文字隐藏方案 在Android应用开发中,无障碍服务(AccessibilityService)是实现自动化操作的重要技术手段。然而,小米手机用户在使用SelectToSpeakService等系统…...

ClawdBot入门指南:零配置管理访问权限,安全使用个人AI

ClawdBot入门指南:零配置管理访问权限,安全使用个人AI 1. ClawdBot简介:你的本地AI助手 ClawdBot是一个可以在个人设备上运行的AI助手解决方案,它采用vLLM作为后端推理引擎,提供强大的本地化AI能力。与常见的云端AI服…...

超实用 M3U8 在线播放器!m3u8live.cn让流媒体调试更高效

作为开发人员,日常做 HLS 流媒体开发、测试时,是不是总被 M3U8 链接验证、视频流调试的问题困扰?找一款免安装、兼容性强、无广告的在线播放器,能大幅提升开发效率,而m3u8live.cn就是这样一款专为开发者打造的 M3U8 在…...

全球股市估值与小型核聚变反应堆技术的发展

全球股市估值与小型核聚变反应堆技术的发展关键词:全球股市估值、小型核聚变反应堆技术、金融市场、能源科技、投资趋势、技术发展周期、市场影响摘要:本文深入探讨了全球股市估值与小型核聚变反应堆技术发展之间的关联。首先介绍了研究的背景、目的、预…...

ThinkPHP 6.x 安全漏洞深度解析:如何避免任意文件写入风险

ThinkPHP 6.x 安全漏洞深度解析:如何避免任意文件写入风险 在企业级应用开发中,框架安全始终是开发者需要高度关注的核心议题。ThinkPHP作为国内广泛使用的PHP开发框架,其6.x版本曾因会话处理机制的设计缺陷导致严重的任意文件写入漏洞&#…...

PCB设计避坑指南:Allegro中常见的命名错误及如何避免

PCB设计避坑指南:Allegro中常见的命名错误及如何避免 在PCB设计领域,命名规范看似是一个基础问题,却往往成为项目进度和团队协作的隐形杀手。特别是在使用Cadence Allegro这类专业工具时,一个不规范的命名可能导致从设计到生产的全…...

手把手教你用LRW-1000数据集训练中文唇语识别模型(附完整代码)

中文唇语识别实战:从LRW-1000数据集到工业级模型部署 在智能交互与无障碍技术快速发展的今天,唇语识别作为语音识别的重要补充,正在数字人、安防监控、听障辅助等领域展现出独特价值。本文将带您深入中文唇语识别系统的完整构建流程&#xf…...

Montgomery模乘算法解析:从理论到硬件实现的完整指南(含实例计算)

Montgomery模乘算法解析:从理论到硬件实现的完整指南(含实例计算) 在密码学和安全芯片设计领域,模乘运算的高效实现一直是性能优化的关键瓶颈。传统模乘算法需要频繁执行耗时的除法操作,而Montgomery算法通过巧妙的数学…...

面试官:说说动态线程池实现原理?

在线 Java 面试刷题(持续更新):https://www.quanxiaoha.com/java-interview目录面试考察点核心答案深度解析一、动态线程池整体架构二、核心方法源码解析三、动态调整的线程安全保障四、实战:基于 Nacos 的动态线程池实现五、主流…...

Dify 私有化部署实战:Linux openEuler 环境下的 Docker Compose 安装指南

1. 环境准备与系统配置 在开始Dify私有化部署之前,我们需要确保openEuler系统环境满足基本要求。我去年在国产化项目中首次接触openEuler时,发现这个华为推出的Linux发行版对ARM架构有很好的支持,特别适合企业级应用部署。 1.1 硬件需求检查 …...

Clawdbot企业微信入口配置:从环境准备到生产加固,一步不漏

Clawdbot企业微信入口配置:从环境准备到生产加固,一步不漏 1. 企业微信接入的核心价值 Clawdbot汉化版的企业微信入口解决了国内企业使用AI助手的三大痛点: 合规性:完全符合国内企业通讯规范,无需依赖境外平台安全性…...

社区待就业人员信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着社会经济的快速发展,就业问题成为影响社会稳定和民生福祉的重要因素。社区作为基层治理的重要单元,承担着为待就业人员提供就业帮扶、技能培训和岗位推荐等服务的职责。然而,传统的社区就业服务管理方式存在信息分散、效率低下、数据…...

Fish-Speech-1.5在STM32嵌入式系统的轻量化部署

Fish-Speech-1.5在STM32嵌入式系统的轻量化部署 1. 引言 想象一下,你正在开发一款智能家居设备,需要让设备能够用自然的人声与用户交流。传统的语音合成方案要么需要云端服务,要么需要昂贵的专用芯片。但今天,我要分享一个创新的…...

基于VSG控制的MMC并网逆变器MATLAB仿真模型 有参考文献 采用模块化多电平和虚拟同步发...

基于VSG控制的MMC并网逆变器MATLAB仿真模型 有参考文献 采用模块化多电平和虚拟同步发电机控制相结合的模式,以提高MMC变流站在弱电网中惯量和阻尼特性 其中包括有功频率环和无功电压环 仿真分析: 设置电网电压10kV,频率50Hz,设置…...

新能源电动汽车整车控制器VCU,硬件原理图+PCB,商用车量产产品,主控芯片MPC5744

新能源电动汽车整车控制器VCU,硬件原理图PCB,商用车量产产品,主控芯片MPC5744最近在研究新能源电动汽车的整车控制器VCU,不得不说,这玩意儿真是汽车电子的核心大脑。尤其是商用车,那对控制器的要求可不是一…...

Java开发者福音:Spring AI快速搭建AI智能体(珍藏版实战指南)

本文介绍Spring AI 1.0如何让Java开发者无需学习Python,通过添加几个依赖就能在现有项目中快速构建AI智能体。从5分钟快速上手到实现AI记忆功能、工具调用能力,再到企业级应用和实战案例,提供了完整指南,帮助Java开发者轻松进入AI…...

告别命令行!Qwen-Image-2512图片生成服务图形化部署教程

告别命令行!Qwen-Image-2512图片生成服务图形化部署教程 1. 为什么选择图形化部署方案 传统AI模型部署往往需要面对复杂的命令行操作和环境配置,这对于非技术背景的用户来说是个不小的挑战。而基于Qwen-Image-2512-SDNQ-uint4-svd-r32模型的Web服务镜像…...

ESP32开发板快速上手:Arduino IDE环境搭建避坑指南

ESP32开发板快速上手:Arduino IDE环境搭建避坑指南 第一次接触ESP32开发板时,那种既兴奋又忐忑的心情至今记忆犹新。作为一款功能强大且价格亲民的物联网开发平台,ESP32确实为创客和开发者打开了无限可能。但在Arduino IDE中配置ESP32开发环…...

99%的程序员都将失业吗?大模型时代如何转型为AI指挥官

文章探讨了AI编程对程序员职业的颠覆性影响。AI正成为最高级编程语言,未来90%-99%的代码将由AI生成,程序员角色将从代码编写者转型为AI指挥官和问题定义者。AI将降低编程门槛,激发更多需求,催生新职业。人类真正的价值在于提出好问…...