今天,我在《java编程思想》上看见一个例子,这个例子向我展示了一些关于引用的细节
接下来是具体的代码:
class Tank{
int level;
}
public class Assignment {
public static void main(String[] args) {
// TODO Auto-generated method stub
Tank t1=new Tank();
Tank t2=new Tank();
t1.level=9;
t2.level=47;
System.out.println("ti.level:"+t1.level+" t2.level:"+t2.level);
t1=t2;
System.out.println("ti.level:"+t1.level+" t2.level:"+t2.level);
t1.level=500;
System.out.println("ti.level:"+t1.level+" t2.level:"+t2.level);
t1.level=20;
System.out.println("ti.level:"+t1.level+" t2.level:"+t2.level);
t2.level=555555;
System.out.println("=======================================");
System.out.println("ti.level:"+t1.level+" t2.level:"+t2.level);
}
}
output:
ti.level:9 t2.level:47
ti.level:47 t2.level:47
ti.level:500 t2.level:500
ti.level:20 t2.level:20
=======================================
ti.level:555555 t2.level:555555
我们注意看这个语句:
t1=t2;
这句话想表达什么意思呢?
这里是说将 t2 的引用连接到 t1,有c经验的同学可以将 t1 理解成一个指向t2的地址的二级指针
然后我们对t1操作其实就是对 t2 进行操作,我们对t2进行操作也会作用到t1上,因为 t1 最终指向了 t2
细心地同学可能发现了一个问题,那就是 t1 以前指向的那个对象怎么样了
由于t1 指向了 t2, t1 原来指向的地址就没有引用与其连接了,在GC用根节点搜索算法从此对象节点不能追溯到根节点时,会将它回收掉