JAVA操作对象中的“别名现象”
Original text [P40]
对一个对象进行操作时,我们真正操作的是对对象的引用。所以倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方。
E.g_01
class Tank {
int level;
}
public class Assignment {
public static void main(String[] args) {
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 9;
t2.level = 47;
System.out.println("1: t1.level: " + t1.level + ", t2.level: " + t2.level);
t1 = t2;
System.out.println("2: t1.level: " + t1.level + ", t2.level: " + t2.level);
t1.level = 27;
System.out.println("3: t1.level: " + t1.level + ", t2.level: " + t2.level);
}
}
Console_01
1: t1.level: 9, t2.level: 47
2: t1.level: 47, t2.level: 47
3: t1.level: 27, t2.level: 27
Explanation
t1和t2分别是Tank类的两个实例对象的引用。将t2赋值给t1时,t1重新指向的实例对象,与t2指向的是同一个实例对象。t1原本指向的实例对象由于没有引用,会丢失掉,最后被GC回收。相当于t2指向的实例对象,现在多了一个引用t1。可以通过它的任意一个引用,来操作这个实例对象。