Integer类为何不表现为引用类型?代码示例及疑问解析
Integer类为何不表现出预期的引用类型行为?
你提到的代码确实会产生不符合预期的结果,先看代码示例:
class Playground { public static void main(String[ ] args) { Integer i = 10; Integer num = i; i--; System.out.println("i = " + i); System.out.println("num = " + num); } }
输出结果:
i = 9 num = 10
背后的核心原因:Integer是不可变类
Java中的Integer属于不可变类(Immutable Class),这类对象一旦被创建,内部的数值就无法被修改。当你执行i--操作时,实际发生了三个步骤:
- 自动拆箱:把i指向的Integer对象转换为基本类型int(值为10);
- 执行自减运算:将int值10减为9;
- 自动装箱:把新的int值9转换为一个全新的Integer对象,然后让i指向这个新对象。
整个过程中,原来那个值为10的Integer对象根本没有被修改,num依然指向它,所以最终输出的num值还是10。
具有相同行为的类
Java里还有不少不可变类,它们都会表现出类似的行为:
- 所有基本类型的包装类:Long、Short、Byte、Character、Boolean、Float、Double;
- String类:比如执行
str += "test"时,实际是创建了新的String对象,原对象不会被修改; - 高精度计算类:BigInteger、BigDecimal,它们的所有运算操作都会返回新的对象,而非修改原对象。
内容的提问来源于stack exchange,提问作者Egor Khorozhansky
相关产品推荐
相关产品推荐

