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

Java基础-核心知识点:方法参数传递机制 (值传递 vs. 引用传递)

这是 Java 基础中一个非常经典且容易混淆的概念,也是面试中必考的知识点。

1. 核心结论:Java 中只有值传递 (Pass by Value)

无论方法参数是基本数据类型还是引用数据类型,Java 在方法调用时,总是将**实际参数的一个副本(一份拷贝)**传递给形式参数。

2. 什么是值传递?(以及基本数据类型的情况)

  • 定义:方法接收到的是实际参数的值的副本。在方法内部对这个副本的任何修改,都不会影响到方法外部的实际参数。
  • 基本数据类型示例
    public class PassByValueDemo {public static void changePrimitive(int num) {System.out.println("进入方法前,num = " + num); // num = 10num = 20; // 修改的是 num 的副本System.out.println("退出方法前,num = " + num); // num = 20
        }public static void main(String[] args) {int originalNum = 10;System.out.println("调用方法前,originalNum = " + originalNum); // originalNum = 10
            changePrimitive(originalNum);System.out.println("调用方法后,originalNum = " + originalNum); // originalNum = 10
        }
    }
      • 解释:当 changePrimitive 方法被调用时,originalNum 的值 10 被复制一份,传递给了 numnumoriginalNum 拥有各自独立的内存空间。所以在方法内部修改 num 的值,对 originalNum 没有任何影响。

    3. 引用数据类型的传递:依然是值传递 (传递的是引用的副本)

    这是最容易产生误解的地方。很多人会认为引用数据类型是“引用传递”,但实际上,Java 传递的依然是引用地址的副本

    • 核心:传递给方法的是对象内存地址的一个副本。这意味着方法内部和外部的引用变量虽然指向了同一个对象,但它们本身是两个独立的引用变量。
    • 引用数据类型示例
    class MyObject {String value;public MyObject(String value) {this.value = value;}
    }public class PassByReferenceLookalikeDemo {public static void changeObjectValue(MyObject obj) {System.out.println("进入方法前,obj.value = " + obj.value); // obj.value = "Original"obj.value = "Changed"; // 通过副本引用修改了同一个对象内部的状态System.out.println("退出方法前,obj.value = " + obj.value); // obj.value = "Changed"
        }public static void swapObjects(MyObject obj1, MyObject obj2) {System.out.println("进入方法前,obj1.value = " + obj1.value + ", obj2.value = " + obj2.value);MyObject temp = obj1;obj1 = obj2; // obj1 的副本指向了 obj2 副本指向的对象obj2 = temp; // obj2 的副本指向了 obj1 副本最初指向的对象System.out.println("退出方法前(方法内部),obj1.value = " + obj1.value + ", obj2.value = " + obj2.value);}public static void main(String[] args) {MyObject myObj = new MyObject("Original");System.out.println("调用 changeObjectValue 前,myObj.value = " + myObj.value); // myObj.value = "Original"
            changeObjectValue(myObj);System.out.println("调用 changeObjectValue 后,myObj.value = " + myObj.value); // myObj.value = "Changed"// 结果显示对象内部状态被修改了,这让人误以为是引用传递
    System.out.println("\n--- 证明是值传递的经典案例:交换引用 ---");MyObject a = new MyObject("A");MyObject b = new MyObject("B");System.out.println("调用 swapObjects 前,a.value = " + a.value + ", b.value = " + b.value); // A, B
            swapObjects(a, b);System.out.println("调用 swapObjects 后,a.value = " + a.value + ", b.value = " + b.value); // A, B// 结果显示外部的 a 和 b 引用并没有被交换,证明传递的是引用的副本
        }
    }
    • 解释
      • changeObjectValue 方法被调用时,myObj 存储的内存地址被复制一份,传递给了 obj。此时,myObjobj 都是独立的引用变量,但它们都指向堆中同一个 MyObject 对象
      • 在方法内部,通过 obj.value = "Changed"; 这种操作,我们是修改了 obj 指向的那个对象内部的 value 字段。由于 myObj 也指向同一个对象,所以从 myObj 来看,对象的内部状态被改变了,这看起来很像“引用传递”。
      • 但通过 swapObjects 示例,可以清晰地证明是值传递。在方法内部,obj1obj2副本被交换了,但方法外部的 ab 原始引用并未受到影响,它们仍然指向最初的对象。这说明,方法改变的只是它自己接收到的引用副本的指向,而非外部原始引用的指向。

    4. 总结

    Java 中只有值传递 (Pass by Value)

    • 基本数据类型:传递的是值的副本。
    • 引用数据类型:传递的是引用地址的副本。虽然方法内可以通过引用副本修改对象内部状态,但如果修改引用副本本身的指向(例如在方法内 obj = nullobj = new AnotherObject()),不会影响外部的原始引用。
http://www.jsqmd.com/news/267780/

相关文章:

  • 亲测好用!专科生毕业论文AI论文写作软件TOP9
  • AI漫剧干货:导演实战词库,几十个运镜指令详解与组合心法
  • 2026 广州出国英语雅思封闭式培训班课程口碑排名:权威测评 TOP5,高性价比提分推荐 - 老周说教育
  • 2026年AI优化推荐:基于工业与零售双场景评价,直击转化率低与效率低下痛点 - 十大品牌推荐
  • 为什么双十一零点你抢不到票?
  • 【收藏必备】ReAct范式详解:从入门到实践,让大模型拥有推理与行动能力
  • git: merge所做修改用git log -p看不到
  • Nginx 为什么用漏桶,而 Guava 用令牌桶?一文看懂限流算法的底层逻辑
  • 学霸同款2026 AI论文平台TOP9:本科生毕业论文写作全测评
  • vue3基于Python协同过滤算法的图书馆图书借阅推荐系统设计与实现217413115
  • 宿迁市宿城宿豫沭阳泗阳泗洪区英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 老周说教育
  • 用 MySQL SELECT SLEEP() 优雅模拟网络超时与并发死锁
  • vue3-python县志捐赠与借阅信息管理系统的设计与实现16069432
  • Kali Linux 内网渗透:深度工程实施手册
  • 多智能体协作驱动的多模态医疗大模型系统:RAG–KAG双路径知识增强与架构的设计与验证(上)
  • 避坑指南:精准度高、售后好的国产不锈钢电子地磅品牌推荐,上海花潮实业实力解析 - 品牌推荐大师1
  • 【教程4>第10章>第22节】基于FPGA的图像Laplace边缘提取算法开发——Laplace拉普拉斯卷积运算模块
  • 深入解析:概率论与数理统计第一章 概率论的基本概念
  • 软件测试在职人员,如何持续学习?
  • 技术文章:解决 PowerShell 模块加载无响应问题的实用指南
  • 2026国内最新螺丝定制厂家最新top5排行榜发布!广东等地优质组合螺丝/端子螺丝/螺丝定制/螺丝加工公司及供应商综合实力盘点 - 品牌推荐2026
  • 提拔快的项目经理,打死也不会告诉别人的3个反向操作!
  • 探讨忻州比较好的geo推广机构情况,如何选择 - 工业品牌热点
  • 大模型学习指南:10个核心概念详解,收藏学习不走弯路
  • AI一周重要会议和活动概览(1.19-1.25)
  • vLLM模型脚本目录规范
  • 基于51/STM32单片机交流直流电压电流电表功率电量过载抄表无线设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 2026年AI搜索优化推荐:基于垂直行业实战排名,涵盖B2B与消费场景获客痛点 - 十大品牌推荐
  • 黄金票据是什么
  • STM32智能PID无刷电机PWM调速正反转设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码