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、这段代码真正做了什么呢?来解释一下这个过程

首先,当字符串"ab"被创建时,Java分配内存来存储这个字符串常量;然后,这个字符串常量被赋值给了变量x,x实际上保存的是这个字符串对象的引用地址(内存中的地址);x变量保存了字符串对象的引用,x并不是引用本身,它仅仅保存的是内存的引用地址;

而在Java中,都是“值传递”;当x传递给change()方法时,实际上传递的是变量 x 的拷贝;change()方法又创建了一个新的字符串对象"cd",并赋值给了变量x的拷贝,"cd"对象的内存引用地址是不同的!

3、怎么解决这个问题呢?

如果我们确实希望改变这个对象。首先这个对象必须是可变的;第二,需要保证不会创建新的对象赋值给参数变量,因为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");
}

最新文章

  1. folly::AtomicHashmap源码分析(二)
  2. 【WebService】WebService的创建和使用——文件名称生成器
  3. C#-WinForm-跨窗体 构造函数传值 及应用—登录式窗口传值、如何关闭主页面时关闭应用程序、如何打开唯一窗口—★★★★★五星重量级
  4. URL Quoting
  5. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(一)
  6. Hadoop第7周练习—MapReduce进行数据查询和实现推简单荐系统
  7. Android 加入一个动作按钮
  8. Highcharts 功能强大、开源、美观、图表丰富、兼容绝大多数浏览器的纯js图表库
  9. 解决VirtualBox 上的XP 蓝屏,自动重复启动
  10. const以及入栈出栈
  11. web安全实战
  12. C++赋值运算符与赋值表达式
  13. fzu 2150 Fire Game 【身手BFS】
  14. 状态压缩动态规划 状压DP
  15. Javascript学习-简单测试环境
  16. Leetcode 20.有效的括号 By Python
  17. suoi38 卖XY序列 (贪心+前缀和)
  18. 【黑客免杀攻防】读书笔记5 - PE格式讲解
  19. 《当大数据遇见网络:大数据与SDN》
  20. 最小生成树--prim+优先队列优化模板

热门文章

  1. linux DTS介绍
  2. numpy-tile 数组复制
  3. Codeforces6E_Exposition
  4. RabbitMQ入门教程(十二):消息确认Ack
  5. Linux音频编程(三)混音器介绍
  6. rsyslog+loganalyzer日志服务器,无法添加报表模板解决
  7. tomcat CATALINA_HOME与CATALINA_BASE的区别
  8. java 集合之HashMap、Hashtable、LinkedHashMap、TreeMap
  9. 从输入一个URL到页面渲染的流程简介
  10. Django 创建 hello world