gpt4 book ai didi

java - 为什么不可变类 Integer 可以重置其值?

转载 作者:行者123 更新时间:2023-12-01 18:40:10 26 4
gpt4 key购买 nike

我之前读到包装类都是不可变的。不可变意味着该值不能更改。下面我尝试了这个简单的示例,它可以粘贴到任何主要方法中。首先,我创建一个包含值 5 的 Integer。不可变意味着它们不能改变,所以为什么我可以将 I 设置为 89。我认为这是因为它改变了 (I) 指向的位置,但我不确定为什么会这样。

在我的下一个小示例中,我创建了一个 x 的整数,如果我尝试更改它,它将抛出错误。在这种特定情况下 x 似乎是不可变的,但在 (i) 变量的情况下则不然。

似乎我可以随时更改(i)的值,所以实际上没有final关键字的整数不是不可变的???如果我可以设置为 89 那么对我来说这似乎可以更改该变量。

我已经阅读了其他关于此的文章,但我仍然不确定为什么我可以更改为另一个变量。另外,在编写代码时,声明基本类型的最佳方法是什么。为什么不一直使用包装类来创建变量。

int y = 5; 
Integer i = new Integer(y);
i = 89;
final Integer x = Integer.valueOf(5);

System.out.println("Integer:(i) " + i.intValue());
System.out.println("Integer:(i) " + i.byteValue());

System.out.println("Integer:(x) " + x.intValue());;
System.out.println("Integer:(x) " + x.byteValue());;

i = i - 5;

使用所有包装类来声明变量:(这比使用原始变量类型声明这些变量更好)

Integer a = new integer(MyNewValue);
Integer b = new integer(MyNewValue);
Integer c = new integer(MyNewValue);
Integer d = new integer(MyNewValue);
Float fa = new integer(MyNewValue);

最佳答案

您正在混淆两件事:更改“对象”本身的值和更改引用指向的对象。说 i = 89 只是将变量 i 指向一个新对象;它不会更改 i 最初指向的 Integer 对象。

使用final前置变量声明只是确保禁止重新分配,它绝不是其指向的对象的可变性/不可变性的声明。也许跑题了,但我个人认为这篇文章Java is Pass-by-Value, Dammit!值得一读。

关于java - 为什么不可变类 Integer 可以重置其值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20272390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com