1.工具类,用于调试验证
public static class Modes{
Modes next;
int age=0;
@Override
public String toString() {
return "Modes{" +
"next=" + next +
", age=" + age +
'}';
}
}
2.数据输出和验证
public static void main(String args[]) {
Modes msg=new Modes ();
msg.age=2; //A
Modes sPool=new Modes ();
sPool.age=1;
sPool.next=msg;
Modes mMessages3 = new Modes ();
mMessages3.age=3;//指向内存 A
Modes mMessages5 = new Modes ();
mMessages5.age=5;//指向内存 B
mMessages3=mMessages5; // B 的内存地址赋值给了 A 对象 ,所以赋值后无论操作原有的 A 或者B 对象,
// 他们的内存地址被关联到了一起,此时无论操作哪个对象 mMessages3或者mMessages5 他们的输出都会是一样的
// 因为他们引用的是堆中的同一块内存地址
mMessages5.age=1;
System.out.println("1-mMessages:" + mMessages3 +","+ mMessages5);
//mMessages3 ={ age=3 ,next=null} ---> { age=1 ,next=null}
//mMessages5 ={ age=5 ,next=null} ---> { age=1 ,next=null}
mMessages3.age=2;
System.out.println("2-mMessages:" + mMessages3 +","+ mMessages5);
//mMessages3 ={ age=1 ,next=null} ---> { age=2 ,next=null}
//mMessages5 ={ age=1 ,next=null} ---> { age=2 ,next=null}
mMessages5=null;
System.out.println("3-mMessages:" + mMessages3 +","+ mMessages5);
//mMessages3 ={ age=1 ,next=null} ---> { age=2 ,next=null}
//mMessages5 ={ age=1 ,next=null} ---> null
/*总结:
当一个对象A,通过=,赋值给另一个对象B时, B=A, 实际上是对这两个地址引用做了关联关系,A 的地址指向了B,也可以理解为B 对A 的引用
这时无论改变对象A 或者对象B 的值,他们输出的值都是一样的,因为他们指向了同一个地址 A,所以改变的都是地址A,的值。因为B对A进行引用
,所以这时他们的值也是同步的,所以当他俩关联关系取消后(mMessages5=null;)输出B 的值 ,还是最会一次赋值的有效值,而A 变为了null
当然B 的内存地址现在指向的还是是A,,不过现在只有一个对象mMessages3 对A 进行了引用。
* */
//现在我们定义一个对象变量,然后将mMessages3 A赋值给 mMessagesL,这时mMessagesL 只是一个空对象变量,存放在栈中,没申请内存
Modes mMessagesL=null;
//给mMessagesL 赋值,将A 内存地址指向mMessagesL并赋值,在栈生成引用关系
mMessagesL=mMessages3;
//mMessagesL= null --->{ age=2 ,next=null}
System.out.println("4-mMessagesL:" + mMessagesL);
//将A mMessages3 置空,将该变量引用指向一个null ,这样这个对象就不再被引用,等待垃圾回收,但是mMessagesL 引用了mMessages3
// 的内存地址,所以即使mMessages3 置空,A堆中的内存还是无法回收,因为还在被mMessagesL 引用,所以输出mMessagesL ,他的值不为null
// 所以在实际应用中,如果定义了多个对象变量,来接收同一个对象的引用A,当需要将他们回收时,需要将所有引用对象都置空,
// 而不是仅仅将A 被引用对象置空
mMessages3=null;
System.out.println("5-mMessages3:" + mMessages3 +","+mMessagesL);
//mMessages3 =null
//mMessages5 =null
//mMessagesL ={ age=2 ,next=null} --->{ age=2 ,next=null}
}
3.输出结果
1-mMessages:Modes{next=null, age=1},Modes{next=null, age=1}
2-mMessages:Modes{next=null, age=2},Modes{next=null, age=2}
3-mMessages:Modes{next=null, age=2},null
4-mMessagesL:Modes{next=null, age=2}
5-mMessages3:null,Modes{next=null, age=2}