首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不可变的类Integer可以重置其值?

为什么不可变的类Integer可以重置其值?
EN

Stack Overflow用户
提问于 2013-11-28 18:05:08
回答 3查看 283关注 0票数 0

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

在我的下一个小例子中,我创建了一个x的整数,如果我试图改变它,它就会抛出一个错误。在这种特殊情况下,x似乎是不可变的,但在(i)变量的情况下则不是这样。

似乎我可以随时改变(i)的值,在现实中,Integer没有最终的关键字是不可变的?如果我可以设置为89,那么对我来说,这似乎是可以改变的变量。

我读过其他关于这方面的文章,但我仍然不知道为什么我可以改变为另一个变量。此外,在编写代码时,声明基本类型的最佳方法是什么。为什么不一直使用包装类来创建变量呢?

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
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);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-28 18:08:58

调用i = 89;时,不更改存储在内存中的Integer对象的值。相反,您将为i分配一个价值89的全新i。所以不变的规则不会被打破。

请记住,i只是指向Integer的引用,而不是实际的Integer本身。

票数 1
EN

Stack Overflow用户

发布于 2013-11-28 18:08:32

您合并了两件事情:更改“对象”本身的值和更改引用指向的对象。说i = 89只是将变量i指向一个新对象;它并不改变最初由i指向的Integer对象。

使用final的预挂变量声明只会确保重新分配是被禁止的,它绝不是它所指向的对象的可更改/不可变的声明。也许是离题,但我个人认为Java是通过价值传递的,该死的!是个不错的读物。

票数 2
EN

Stack Overflow用户

发布于 2013-11-28 18:14:33

是的,整数看起来确实在变化,但是第3行所发生的一切是编译器将其转换为i = new Integer(89)。如果你想看,你可以

代码语言:javascript
复制
Integer i1 = i;
i = 83;
println(i); \\ prints out the original value 5
println(i1); \\ prints out a new value, 83

当您将某项声明为final时,您不能更改变量的定义,尽管您仍然可以在其中更改任何内容。JavaRanch有一个非常好的类比来帮助

当您可以避免使用包装对象时,您不应该使用它,因为它们比原语效率低,并且占用一些额外的字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20272390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档