每天都在变化,每天都在进步
本篇博客从例子出发讲解对象和对象引用的关系
基础情况
A a=new A(); A a; //创建了个A 类型的引用a,此时指向null new A(); //在堆中创建了一个类A的对象,返回其引用地址 = //将对象的地址给予引用
情景1
A a=new A(); //(01) A b=a;//(02) a=null;//(03)
此时b仍然有数据,因为(02)的时候,发生了复制行为,引用发生了复制,也就是此时a,b 同时指向了(01)的时候创建的对象,此时即使执行了(03),原有的内容仍在,b的引用仍然在。
情景2
public void test(A test){ test=new A(); } A a=new A();//(01) test(a); //(02)
结论: (01)步骤的a引用仍是原来的,并没因为(02 )发生变化,因为方法传参的时候也发生了引用的复制,所以此时(02),对第二个test引用进行了修改并不影响(01)的内容
情景3
public void test(A test){ test.setB("dd"); } A a=new A();//(01) test(a); //(02)
结论:此时a的引用对象内容改变,因为引用和复制后的引用都指向相同的对象,此时会发生变化
情景4
对于List、Map 是等同的
A a=new A(); List<A> test=new ArrayList<>(); test.add(a); a=null;
结论:这个情况和情景2类似,发生了方法传参
总结:对于对象引用来说 “=” 和传参会导致引用复制,此时就相当于多个引用对应于一个对象,此时其中的一个引用更换引用或者设置为null并不会影响其他的引用,如果修改了对象,则对于所有引用,其内容都是一致的。