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

java中值传递的含义

Java 中的值传递(Pass by Value)详解

在 Java 中,所有参数的传递都是值传递(Pass by Value),但根据传递的数据类型不同(基本类型 vs 引用类型),表现行为会有所不同。


1. 基本数据类型(Primitive Types)的值传递

对于基本类型(intdoublechar 等),传递的是值的副本,方法内修改不会影响原始值。

代码示例

public class Main {public static void modifyValue(int x) {x = 20; // 修改的是副本System.out.println("方法内: x = " + x); // 输出 20}public static void main(String[] args) {int a = 10;modifyValue(a); // 传递 a 的副本System.out.println("方法外: a = " + a); // 输出 10(未被修改)}
}

输出:

方法内: x = 20  
方法外: a = 10  // 原始值不变

关键点

  • 传递的是值的拷贝,方法内修改的是副本。


2. 引用数据类型(Reference Types)的值传递

对于对象(如 String、数组、自定义类),传递的是引用的副本(即内存地址的拷贝),方法内修改对象属性会影响原始对象,但重新赋值引用不会影响原始引用。

示例1:修改对象属性(会影响原始对象)

class Person {String name;Person(String name) { this.name = name; }
}public class Main {public static void modifyObject(Person p) {p.name = "李四"; // 修改对象属性System.out.println("方法内: " + p.name); // 输出 李四}public static void main(String[] args) {Person person = new Person("张三");modifyObject(person); // 传递引用的副本System.out.println("方法外: " + person.name); // 输出 李四(属性被修改)}
}

输出:

方法内: 李四  
方法外: 李四  // 原始对象的属性被修改

示例2:重新赋值引用(不会影响原始引用)

public class Main {public static void reassignReference(Person p) {p = new Person("王五"); // 重新赋值引用(不影响原始引用)System.out.println("方法内: " + p.name); // 输出 王五}public static void main(String[] args) {Person person = new Person("张三");reassignReference(person); // 传递引用的副本System.out.println("方法外: " + person.name); // 输出 张三(原始引用未变)}
}

输出:

方法内: 王五  
方法外: 张三  // 原始引用未变

关键点

  • 传递的是引用的副本(指向同一对象)。

  • 修改对象属性会影响原始对象。

  • 重新赋值引用(如 p = new Person())不会影响原始引用。


3. 常见误区澄清

误区1:“Java 是引用传递”

  • 错误:Java 只有值传递,但对于引用类型,传递的是引用的副本(不是引用本身)。

  • 正确理解:可以认为是“按共享对象的值传递”。

误区2:“String 是特殊的引用类型”

  • String 是引用类型,但因其不可变性(Immutable),方法内修改会创建新对象,不影响原始字符串。

public static void modifyString(String s) {s = "new string"; // 创建新对象,不影响原始引用
}

4. 图解值传递

基本类型传递

main 栈帧: a = 10  
modifyValue 栈帧: x = 10 → 修改为 20(副本)

引用类型传递

main 栈帧: person → 对象A(name="张三")  
modifyObject 栈帧: p → 对象A(修改 name="李四")

总结

场景行为
基本类型传递值的副本,方法内修改不影响原始值。
引用类型传递引用的副本,方法内修改对象属性会影响原始对象,但重新赋值引用不会。

核心结论
Java 中所有参数传递都是值传递,没有引用传递(Pass by Reference)。理解这一点是避免编程错误的关键!

http://www.xdnf.cn/news/1179.html

相关文章:

  • IDEA下载kotlin-compiler-embeddable特别慢
  • 从零开始配置 Zabbix 数据库监控:MySQL 实战指南
  • RFID手持机,助力固定资产高效管理
  • 工业以太网无线网桥:无线通信的工业级解决方案
  • macOS安全隐私最佳实践分析
  • vscode:Live Server Preview插件
  • HarmonyOS Next 编译之如何使用多目标产物不同包名应用
  • 深入解析C++ STL List:双向链表的特性与高级操作
  • 再话git merge和rebase
  • GIT合并/推送报错
  • Redis 处理读请求
  • 针头式过滤器推荐
  • 虚幻基础:动画k帧
  • csv数据的写入
  • nifty数据格式中qform 和sform
  • 电子电器架构 --- 面向下一代车辆的演进式(发展演变的)汽车网关
  • C++ std::forward 详解
  • WLAN 漫游技术全解析:类型、转发模式与应用场景
  • C++ 拷贝构造函数 浅拷贝 深拷贝
  • Spring开发系列教程(26)——异步处理
  • 中和农信从信贷支持到多元服务的创新实践
  • el-table中el-input的autofocus无法自动聚焦的解决方案
  • DasViewer软件打开、保存、关闭文件
  • 部署私有gitlab网站
  • 基于大语言模型的减肥健身计划系统设计与实现
  • 小雨滴的奇妙旅行
  • 【MQ篇】RabbitMQ初体验!
  • 残差(Residual)
  • (区间 dp)洛谷 P6879 JOI2020 Collecting Stamps 3 题解
  • Spring Boot 应用优雅关闭