在java编程中因为变量赋值“=”会产生一些奇怪的现象,如下:
class Person {
int age;
}
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);
//第三步,以下注意
p1.age = 18;
System.out.println("3. p1.age: " + p1.age + ", p2.age: " + p2.age);
}
}
运行结果:
1. p1.age: 18, p2.age: 21
2. p1.age: 21, p2.age: 21
3. p1.age: 18, p2.age: 18
我们可以看到第三步中产生的两个对象age都为18,这里可能不好理解,我们可以利用内存进行分析:
在内存中我们很容易看到,第一步中属于正常的操作,第二步执行后将p2赋值给p1,内存中的表现是p1,p2指向同一块堆中的同一块对象,第三步执行时,二者还是在第二步的基础上操作,依旧指向同一块,这时改变块中的age成员变量,意味着p1.age与p2.age都同时改变。