亲爱的程序员兄弟姐妹们:
是不是有那么一瞬间,你写着写着代码,突然怀疑人生:
ini
int a = 1;
int b = a;
a = 2;
System.out.println(b); // 结果是1,没变!
User user = new User("张三");
User user1 = user;
user = new User("李四");
System.out.println(user1.getName()); // 结果还是张三,没变!
这是不是耍我?
别慌,今天咱们用箱子和标签这个有趣的比喻,帮你一次性搞清楚!
一、Java的铁律:只有值传递!
无论是:
- 基本数据类型(int、double、char...)
- 引用数据类型(对象、数组、集合...)
Java 永远都是值传递。
二、基本数据类型:值传递------我拿的是实物
ini
int a = 1;
int b = a;
a = 2;
System.out.println(b); // 输出1
- 这里的
a
和b
像是两个独立的小箱子。 - 开始时,你把
1
这个"苹果"放到了两个箱子里。 - 改变
a
之后,b
还是原来那个箱子,彼此完全独立。

✅ 关键:
- 基本类型赋值时是值的副本(实物副本) 。
- 改变一个,对另一个没任何影响。
三、引用数据类型:地址传递------我拿的是标签
ini
User user = new User("张三");
User user1 = user;
user = new User("李四");
System.out.println(user1.getName()); // 张三
user
和user1
拿到的其实是同一张房子地址的标签。- 当
user = new User("李四")
,只是换了个新房子 ,user1
还拿着原来的老房子("张三")的地址。

✅ 关键:
- 引用类型赋值时,复制的是地址标签。
- 改变标签指向(新 new 一个对象),不会影响其他手持旧标签的人。
- 只有改房子内部装修(改对象属性) ,其他人才会感知到。
四、经典对比表格:
类型 | 赋值时复制的内容 | 修改是否影响副本 | 改变引用是否影响副本 |
---|---|---|---|
基本类型(int) | 实际值 | ❌ 不影响 | 不适用 |
引用类型(对象) | 地址(引用值) | ✅ 改内容会影响 | ❌ 改引用无影响 |
五、最通俗的比喻:
- 基本类型 : 就像你给朋友送了一个真正的苹果🍎。你吃掉你自己的,他的还是完整的------实物副本。
- 引用类型: 就像你俩拿着同一间房子的钥匙🔑。房子改造了,谁进来看都是新样子。 但如果你丢了钥匙🗝换了一套新房子,朋友手里还是老钥匙------地址没变,房子还是原来的房子。
六、总结发布版:
- Java 只有值传递,全世界都一样。
- 基本类型:给实物,互不影响。
- 引用类型:给地址,改对象影响彼此,改指针不影响。