一、前言
在Java中,我们经常会使用到赋值操作符"=",但是一般都是直接使用,而没有去注意这个操作符带来的一些陷阱。小菜也是最近看了《Java编程思想第四版》才注意到这一点,也就是博文标题所说的“别名现象”。
二、别名现象
2.1 别名现象的发生场景
- 对对象进行赋值时
- 方法调用中,传递一个对象时
2.2 对对象进行赋值时的别名现象
- Person.java:很简单的一个类,仅仅拥有一个属性
<span style="font-size:18px;">public class Person {
int age;
}</span>
- Client.java:场景类或测试类
<span style="font-size:18px;">public class Client {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.age = 18;
p2.age = 21;
System.out.println("1. p1.age: " + p1.age + ", p2.age: " + p2.age);
p1 = p2; // 使 p2 和 p1 拥有相同的对象引用
System.out.println("2. p1.age: " + p1.age + ", p2.age: " + p2.age);
// 注意 3 的输出
p1.age = 18;
System.out.println("3. p1.age: " + p1.age + ", p2.age: " + p2.age);
}
}</span>
输出如下:
<span style="font-size:18px;">/**********************
* 1. p1.age: 18, p2.age: 21 *
* 2. p1.age: 21, p2.age: 21 *
* 3. p1.age: 18, p2.age: 18 *
*******************************/</span>
- 分析:
主要关注第三行的输出,可以发现当 p1 的 age 值修改为 18 后,p2 的 age 也变为 18 了,这是为什么?why?
原因是因为,当进行对象赋值操作时,如此处的 p2 = p