我之前读到包装类都是不可变的。不可变意味着值不能更改。下面,我尝试了这个简单的例子,它可以直接粘贴到任何主方法中。首先,我创建了一个包含值5的Integer。不变意味着它们不能被改变,所以为什么我可以将i设置为89。我认为是因为它改变了(我)指向的地方,但我不知道为什么会这样。
在我的下一个小例子中,我创建了一个x的整数,如果我试图改变它,它就会抛出一个错误。在这种特殊情况下,x似乎是不可变的,但在(i)变量的情况下则不是这样。
似乎我可以随时改变(i)的值,在现实中,Integer没有最终的关键字是不可变的?如果我可以设置为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);发布于 2013-11-28 18:08:58
调用i = 89;时,不更改存储在内存中的Integer对象的值。相反,您将为i分配一个价值89的全新i。所以不变的规则不会被打破。
请记住,i只是指向Integer的引用,而不是实际的Integer本身。
发布于 2013-11-28 18:08:32
您合并了两件事情:更改“对象”本身的值和更改引用指向的对象。说i = 89只是将变量i指向一个新对象;它并不改变最初由i指向的Integer对象。
使用final的预挂变量声明只会确保重新分配是被禁止的,它绝不是它所指向的对象的可更改/不可变的声明。也许是离题,但我个人认为Java是通过价值传递的,该死的!是个不错的读物。
发布于 2013-11-28 18:14:33
是的,整数看起来确实在变化,但是第3行所发生的一切是编译器将其转换为i = new Integer(89)。如果你想看,你可以
Integer i1 = i;
i = 83;
println(i); \\ prints out the original value 5
println(i1); \\ prints out a new value, 83当您将某项声明为final时,您不能更改变量的定义,尽管您仍然可以在其中更改任何内容。JavaRanch有一个非常好的类比来帮助
当您可以避免使用包装对象时,您不应该使用它,因为它们比原语效率低,并且占用一些额外的字节。
https://stackoverflow.com/questions/20272390
复制相似问题