Why is the object not being updated(为什么没有更新该对象)
问题描述
我编写了这段代码,我想知道为什么引用的对象的值没有更改
Java中的所有调用都是按值调用的。但当调用引用同一对象时,为什么不更新该对象
class Main {
public static void main(String[] args) {
Integer n = 3;
triple(n);
System.out.println("Hello world! " + n);
}
public static void triple(Integer x)
{
x *= 8;
System.out.println("Hello world! " + x);
}
}
实际产量
Hello world! 24
Hello world! 3
但我认为输出应该是
Hello world! 24
Hello world! 24
是否因为Integer类的取消装箱和自动装箱而创建了与‘x’同名的新对象,因为Integer是本地可用的不可变对象,并且不指向传递的参数/对象-n。
推荐答案
将Integer n
传递给triple
方法时,实际上是在传递Integer
对象n
的引用的值。
因此,在triple
方法中,另一个局部变量x
在被调用时指向this引用值。在方法内部,当它将此Integer对象的值乘以8
时,它将创建Integer
的另一个新实例,因为Integer
是不可变的,局部变量x
将指向该实例。
因此您不会在print语句中看到这个新值,因为n
仍然指向Integer的旧实例,该实例仍然是3
。
如果您使用StringBuilder
尝试此操作,您将获得预期的结果:
public static void main(String[] args) {
StringBuilder n = new StringBuilder("foo");
triple(n);
System.out.println("Hello world! " + n);
}
public static void triple(StringBuilder s) {
s.append("bar");
System.out.println("Hello world! " + s);
}
此处的输出将为:
Hello world! foobar
Hello world! foobar
这是因为StringBuilder
是可变的,如果triple
通过追加数据来修改数据,则原始指针n
和新指针s
将指向对象引用的相同值。
这篇关于为什么没有更新该对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么没有更新该对象
基础教程推荐
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01