对象赋值和引用“=”问题回顾

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}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值