java中的传递参数其实都是值传递(引用就是拷贝对象的一个地址)
来源:互联网 发布:js实现探探洗牌特效 编辑:程序博客网 时间:2024/05/22 04:39
Java中String是“引用”传递
如题,在java中这是一个典型的问题。 在stackoverflow上已经有很多相似的问题被提问,并且有很多不正确或不完整的答案。如果你不往深处想,这是一个很简单的问题。但如果深入思考,它却很让人迷惑。
1. 下面是一段很有意思并且让人迷惑的代码
public
static
void
main(String[] args) {
String x =
new
String(
"ab"
);
change(x);
System.out.println(x);
}
public
static
void
change(String x) {
x =
"cd"
;
}
运行它将打印 “ab”.
2. 通常让人迷惑的解释如下
在java堆中x存储指向“ab”的引用。所以当x作为参数传递给change()方法时,它在内存中仍然指向“ab”,如下:
由于java是值传递,所以此时x仍然指向“ab”。当chang()方法执行时,它在内存中创建了一个新的String对象“cd”,并且现在x指向“cd”,如下:
上面的解释看起来非常合理。他们也很清楚java是值传递。但是哪里出错了?
3. 上面的代码到底如何执行的呢?
上面的解释有几处错误。跟踪代码执行全过程是一个很好的方法,并且理解起来很容易。
当“ab”创建后,java分配对象所需内存空间。然后,变量x指向了“ab”,变量实际上是指向对象的引用。这个引用指向对象存储的地址。
x保存了一个指向String对象的地址。x不是引用本身!它是保存一个内存地址(x="cd",是在内存中创建了一个新的对象,并且赋值)。
在Java中只有值传递。当x通过参数传递给change()方法后,x被拷贝了一份。change()创建了另一个对象“cd”,并且x指向了不同的地址空间。实际上是x改变它的引用(指向“cd”),不是x本身。
下图展示了x在内存的变化
4. 错误的解释
上面的问题跟String的不可变没有关系。即使是StringBuilder,结果也一样。关键是变量存储的是引用,而不是引用本身!他饶啦
5. 解决问题
如果真的要改变对象的值。首先,对象应该是可变的,如StringBuilder,另外,我们要确认没有新对象生成并且赋予参数变量,因为java只有值传递
public
static
void
main(String[] args) {
StringBuilder x =
new
StringBuilder(
"ab"
);
change(x);
System.out.println(x);
}
public
static
void
change(StringBuilder x) {
x.delete(
0
,
2
).append(
"cd"
);
}
- java中的传递参数其实都是值传递(引用就是拷贝对象的一个地址)
- 汇编分析参数传递中的地址传递与值传递的区别(指针,引用,值传递)
- java 值传递 引用传递(又叫地址传递,对象传递)
- Java中的值传递和引用传递(参数传递)
- java中的参数传递-值传递、引用传递
- java中的参数传递-值传递、引用传递
- java传值(简单类传递的是值拷贝,类对象传递的是地址拷贝)
- java 值传递与地址传递(引用)的区别
- Java中, 不存在引用传递(也就是地址传递)一说, 全部都是值传递
- JavaScript中的所有参数传递的都是值传递?
- 一道考察函数参数传递、值传递、指针传递(地址传递)、引用传递
- 一道考察函数参数传递、值传递、指针传递(地址传递)、引用传递
- C++ 函数参数传递 值传递,引用传递,地址传递
- c++中的参数传递(值传递和引用传递)
- java 值传递及地址传递(引用传递)
- Java方法参数的传递机制,值传递?引用传递?
- Java的参数传递有值传递和引用传递
- java所有类型的参数传递都是“值传递”
- HBase总结(十三)HBase Shell 常用命令及例子
- jconsole监控远程linux tomcat运行情况的配置 (转)
- 关于Spring AOP与IOC的个人思考
- 二极管钳位电路原理
- vue-router使用及注意事项
- java中的传递参数其实都是值传递(引用就是拷贝对象的一个地址)
- 源码安装httpd-2.4.25(centos6.8minimal)
- 强连通-割点(曾老代码)
- 剑指Offer之面试题13:在O(1)时间删除链表结点
- HBase总结(十二)Java API 与HBase交互实例
- Hibernate Annotation (Hibernate 注解)
- 三层结构
- [web开发]建立本地php MySQL Apache测试服务器
- 【LeetCode】 350. Intersection of Two Arrays II