没懂啊?到底什么区别

没懂啊?到底什么区别

为什么这两个有所不同

对于第一个比较xy,由于400大于127,所以直接在堆中创建对象,x的引用指向400,但是Integer y=x;的代码是具体是在后台怎么操作的?这个操作以后,xy指向的到底是不是一个堆中的类对象,x++以后指向的又是不是一个类对象。如果在后面再加一个y++的话,x==y的返回值又是什么呢?

第二个为什么sb1=sb2;为什么两个指向同一个类对象?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

执行Integer x=400;这段代码会创建一个Integer对象,x的引用指向它;执行Integer y = x;这段代码,将x的引用地址赋值给了y,x的引用和y的引用指向了同一片内存空间。这时,x和y指向同一个对象。之后,执行x++,将会创建一个新的Integer对象401,然后x的引用指向新创建的对象。这时x和y不再指向同一个对象。执行x==y得到结果为false;
执行StringBuilder sb1 = new StringBuilder("123");这段代码时,在堆中生成一个StringBulider对象,内容为:123,这时有一个sb1的引用指向"123"这个内容。执行StringBuilder sb2 = sb1;这段代 码,sb2的引用同样指向"123"这个内容。在执行sb1.append("5");时,会在内存中"123"这个位置变成 了"1235",这时没有在内存当中生成新的对象,也没有新的字符串常量,而是在原来的基础上进行了修 改。sb1和sb2指向的是同一个对象,所以执行sb1==sb2得到结果为true。 

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 慕移动8576453 提问者 #1
    问题1 所以integer创建的对象也有类似跟string类型的字符串不可变性一样的性质,只要内容变了就会新创建一个对象,但是stringbuilder创建的类,就没有这个性质,直接在原来的基础上进行改变是吗? 问题2 integer y=x这个操作的时候有没有进行拆箱和装箱操作?
    2018-10-23 17:41:32
  • 好帮手慕阿满 回复 提问者 慕移动8576453 #2
    Q1:Integer是包装类,和String类似,所以x++相当于创建了一个新的对象。而StringBuilder对对象进行操作是在原来的基础上改变的, Q2:Integer y=x;没有进行拆装箱的操作,y和x都是包装类,所以是直接将x的引用地址赋值给了y。 祝:学习愉快!
    2018-10-23 18:17:42
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师