StackTc 2018-03-02 02:30 采纳率: 90.9%
浏览 783
已采纳

关于自动拆箱跟自动装箱的问题求解

图片说明

求解答案为什么是这些

  • 写回答

7条回答 默认 最新

  • 是启山啊 2018-03-02 03:13
    关注

    这是Integer和Long的equals方法的源码:
    public boolean equals(Object obj) {
    if (obj instanceof Integer) {
    return value == ((Integer)obj).intValue();
    }
    return false;
    }
    public boolean equals(Object obj) {
    if (obj instanceof Long) {
    return value == ((Long)obj).longValue();
    }
    return false;
    }
    这样就可以很清楚解释以上现象啦~
    首先是倒数第四行,abc全部是是Integer,所以b+c的结果是Integer对象,自然返回Ture;
    至于倒数第二行和倒数第一行则是因为a+b的结果是Integer,所以为直接返回False;计算a+h的过程中发生了类型提升,结果为Long,所以就调
    用了longValue(),自然为True;
    第一行和第三行以及倒数第三行均可以用缓存解释~
    至于第二行则是==与equals方法的区别,首先a==b比较的并不是ab代表的内容,而是其内存地址,即引用对象是否是同一个;
    c,d均来源与缓存区,自然地址一样(不是数字一样);而e和f则来自堆栈,相当于new出来的,自然地址不一样啦。
    ok,希望我的解释对您有用

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 关于大棚监测的pcb板设计
  • ¥20 sim800c模块 at指令及平台
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计