问题描述
- 大神帮帮忙解决包装类的问题
-
包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值。这句话究竟什么意思,问了几个人各种说法,例如 Integer it只是声明一个引用。“引用”这种东西唯一的作用就是指向某个具体的东西,放在这里来说,你初始化的时候,让这个引用指向了21这个值,然后在it=22这里又让他指向了22。就好比说“我刚才代表21,现在我代表22”,改变的是这个引用,跟跳槽啊变心的恋人啊抗战时的汉奸啊似的,但那些个值本身是不改变的,21还是21,22还是22. 不明白究竟里面存的是什么,存的引用地址吗?但是不是已经变了么?如果不是引用地址,那里面存的什么?来个明白的给说说。谢谢啦,最好有内存分配图
解决方案
引用好像是存在栈里面的,21,22这些是存在堆里面的。int a = 21; 是栈内的a指向堆内的21,。a = 22; 是本身a指向堆内的21现在变成指向堆内的22。但是堆里面还是有21和22的,只是21现在没被人引用而已,有可能会被system.gc()回收。<- 是我的理解,不一定对的
第一句“包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值”的意思可能是
Integer a = Integer.valueOf(22); 把int-> Integer.
但是a的方法里面没有改变22这个值的方法,只有Value,floatValue,byteValue这些转换类型的方法。Integer还有很多静态方法,那些静态方法根本就不需要用到a,直接Integer.进制转换,Integer.parst(),Integer.ValueOf()就可以。
解决方案二:
Java的包装类,本质是对8中基础类型的数据的包装,所以本质只是让数值具有对象的属性,但是值是不可变的。同一个对象的值是固定的,除非你把它重新指向别的对象。不可变对象,具有很多胜过与其向对应的可变类型的优势。不可变类型更容易设计、实现和使用;它们出错的可能性更小,并且更加安全。本质就是一个对象,有一个数值属性。但是没有提供修改这个数值属性的方法,以确保它的不变特性。
包装类跟String类的本质是一样的,都是不可变的。
时间: 2024-12-03 19:14:07