再谈Java对象:“=”的大坑

17 篇文章 0 订阅
10 篇文章 0 订阅

开始之前,我们先来看一段代码:

class Tank{
    int level;
}

public class assingment{
    public static void main(String[] args)
    {
        Tank tank1 = new Tank();
        Tank tank2 = new Tank();
        t1.level = 9;
        t2.level = 20;
    
        t1 = t2;//a
        System.out.print(t1.level); //b
        System.out.print(t2.level);//c

        t1.level = 30;//d
        System.out.print(t1.level);//f
        System.out.print(t2.level);//g


    }
}

请写出bc和fg处的值:bc处简单,都是20,那么fg处呢?都是30!为什么呢,请往下看

在a处,我们把t2的对象的引用给了t1,这时候t1和t2是同一个对象地址的“代理商”,都可以表示这个对象;在d处,我们通过t1这个代理商改变了真实引用的对象地址的值,由于t2的引用也是指向这个对象,t2.level的值是从这个对象地址里面取的,而这个值已经由t1这个对象给改变了,所以t2.level = 30.

在往深层次一点的解释,就是对象实体在堆中,对象引用在栈里,通过对象的引用去操作在堆里的真实对象实体。引用就像一根绳子,把你(的手)和氢气球联系起来,氢气球就是在堆里的对象实体,你就是t1这个引用。原本t1、t2各有一个绳子,在a处,t1用了新绳子牵到了t2的氢气球上面,这个时候t1和t2都可以操作这个氢气球了。原来t1控制的那个氢气球由于没有绳子控制,意见飞走了(被jvm回收了。

 

所以说,“=”作用于两个对象,是引用的改变。

ps:本文例子来自于《Java编程思想》

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值