在Java里方法参数如何传递_Java值传递机制说明

发布时间 - 2026-01-26 00:00:00    点击率:
Java中所有方法参数都是值传递,基本类型传值副本,对象类型传引用副本;修改对象属性会影响原对象,但重新赋值形参引用则不会;String等不可变类因创建新对象而看似被修改。

Java中所有方法参数都是值传递,没有引用传递。所谓“值传递”,是指方法接收的是实参的副本,而不是实参本身;即使传入的是对象,传递的也只是对象引用的副本,而非引用本身。

基本类型参数:传递真实值的拷贝

对于 int、double、boolean 等基本类型,方法接收到的是该变量值的一个完全独立副本。修改形参不会影响原始变量。

例如:

int a = 10;
change(a);
System.out.println(a); // 输出仍是 10

void change(int x) { x = 20; }

这里 x 是 a 的副本,x 的修改与 a 无关。

对象类型参数:传递引用的副本

当传入一个对象(如 String、ArrayList、自定义类实例)时,实际上传递的是该对象引用(即内存地址)的一个副本。这个副本和原引用指向同一个堆内存中的对象。

因此,在方法内通过该引用修改对象的属性(比如 list.add()、obj.name = "new"),会影响原对象;但若在方法内让形参引用指向新对象(如 obj = new Person()),则不会改变原始引用所指的对象。

例如:

Person p = new Person("Alice");
modify(p);
System.out.println(p.name); // 输出 "Bob"

void modify(Person person) {
  person.name = "Bob";  // ✅ 修改对象内容,生


  person = new Person("Charlie"); // ❌ 只改变副本引用,不影响 p
}

String 和包装类是特例:不可变性掩盖了值传递本质

String、Integer、Double 等是不可变类(immutable)。它们看似“被修改”,其实是创建了新对象并让引用指向它。由于传入的是引用副本,方法内重新赋值对原引用无影响。

例如:

String s = "hello";
changeStr(s);
System.out.println(s); // 输出 "hello",不是 "world"

void changeStr(String str) {
  str = "world"; // 创建新字符串,str 指向新对象,原 s 不变
}

想真正实现“引用传递效果”?靠返回值或包装容器

Java 无法直接修改传入的引用本身,但可通过以下方式间接达成目的:

  • 方法返回新对象,由调用方重新赋值: s = changeStr(s);
  • 传入可变容器(如 AtomicInteger、StringBuilder、List、自定义包装类)来承载数据
  • 将多个相关值封装进一个对象,传对象引用并在内部修改其字段

这些做法不改变 Java 的值传递本质,而是利用对象可变性或显式赋值来达到预期效果。


# java 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何编写单元测试和功能测试?(PHPUnit示例)  如何在阿里云部署织梦网站?  如何快速生成凡客建站的专业级图册?  java中使用zxing批量生成二维码立牌  Laravel如何配置任务调度?(Cron Job示例)  如何用wdcp快速搭建高效网站?  微信小程序 canvas开发实例及注意事项  如何破解联通资金短缺导致的基站建设难题?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Laravel如何使用Blade组件和插槽?(Component代码示例)  Python面向对象测试方法_mock解析【教程】  如何选择可靠的免备案建站服务器?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  个人网站制作流程图片大全,个人网站如何注销?  如何用花生壳三步快速搭建专属网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  音乐网站服务器如何优化API响应速度?  网页设计与网站制作内容,怎样注册网站?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel如何自定义错误页面(404, 500)?(代码示例)  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何在万网利用已有域名快速建站?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  用yum安装MySQLdb模块的步骤方法  详解MySQL数据库的安装与密码配置  javascript基于原型链的继承及call和apply函数用法分析  电商网站制作价格怎么算,网上拍卖流程以及规则?  如何快速选择适合个人网站的云服务器配置?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  如何快速查询域名建站关键信息?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何在橙子建站上传落地页?操作指南详解  中山网站推广排名,中山信息港登录入口?  高端建站如何打造兼具美学与转化的品牌官网?  详解Android图表 MPAndroidChart折线图  javascript如何操作浏览器历史记录_怎样实现无刷新导航  EditPlus中的正则表达式实战(6)  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Java遍历集合的三种方式  如何批量查询域名的建站时间记录?  制作旅游网站html,怎样注册旅游网站?  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  如何在阿里云域名上完成建站全流程?  文字头像制作网站推荐软件,醒图能自动配文字吗?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南