问题描述:

首先,看一个小的测试程序:

 public static void main(String[] args)
{
testStringBuffer test = new testStringBuffer(); StringBuffer stringBufferA = new StringBuffer("A");
StringBuffer stringBufferB = new StringBuffer("B");
StringBuffer stringBufferC = new StringBuffer("C"); test.change(stringBufferA, stringBufferB, stringBufferC); System.out.println(stringBufferA);
System.out.println(stringBufferB);
System.out.println(stringBufferC);
}
public void change(StringBuffer stringBufferA,StringBuffer stringBufferB,StringBuffer stringBufferC)
{
stringBufferA = new StringBuffer("AA");
stringBufferB.append("B");
stringBufferC = stringBufferA;
stringBufferC.append("C");
}

分析:
第一步,main()方法中,会创建3个StringBuffer实例,并且为他们分别“赋值”:

第二步,进入到change()方法,首先执行了stringBufferA = new StringBuffer("AA");,,该行代码是在在内存中又实例化了一个StringBuffer,并“赋值”为AA:

第三步,执行stringBufferB.append("B");,,首先append()方法是将指定的字符串追加到目标字符序列,因为在main()方法调用change()方法时,给其传了三个参数,而在执行该行代码时,stringBufferB所引用的就是main()中stringBufferB引用的值"B",因此在使用append()方法追加字符时,就是改变了"B"的值为"BB":

第四步,执行stringBufferC = stringBufferA; ,,即将stringBufferC指向了stringBufferA,那么stringBufferC所表示的值就是stringBufferA表示的值,而在执行stringBufferA = new StringBuffer("AA");时,change()方法中stringBufferA的值已经发生了改变,指向了"AA",在stringBufferC引用stringBufferA时,也应该指向"AA":

第五步,执行stringBufferC.append("C");,,即向stringBufferC所指向的值追加"C",因此其值应该改变为"AAC":

第六步,因此在change()方法执行完了以后,返回到main()方法,进行StringbufferA、StringbufferB、StringbufferC的输出时,输出的值应该就是:A、BB、C

因为,在change()方法中,并未改变main()方法中变量(出StringbufferB)所引用值的值,而引用类型的数据类型,并不是真正的传值,传的是引用的地址,因此即使在change()方法是void的情况下,StringbufferB所引用的值也被改变了

总结:

前期的学习中,,所遇到的8种数据类型,即基本类型,包括后面用到的引用数据类型中,String类型是最特殊的数据类型,在对String类型变量的操作时,应该注意其指向的变化,而不是值得变化,因为String类型的长度不可变

后面会继续学习String.concat()方法和StringBuffer.append()方法的区别

最新文章

  1. 简单谈谈如何利用h5实现音频的播放
  2. Thinkphp上传文件
  3. 数据库高可用架构(MySQL、Oracle、MongoDB、Redis)
  4. 一些Linux的路径
  5. typedef 用法及 指针函数 和 函数指针
  6. 关于laravel框架的Auth::attempt验证失败
  7. textarea内容有换行时存入数据库丢失问题的解决 (转载)
  8. 第3阶段——内核启动分析之start_kernel初始化函数(5)
  9. C语言程序设计第三次作业 —— 选择结构(1)
  10. MarkdownPad
  11. cnetos7设置中文显示及中文输入法
  12. Java基础之多线程篇(线程创建与终止、互斥、通信、本地变量)
  13. C# 发送email邮件!
  14. A - K进制下的大数
  15. U盘支持启动windows和Linux
  16. Ajax核心技术代码
  17. mysql的“The user specified as a definer (”@’%') does not exist”问题 解决
  18. Linux进程间通信(消息队列/信号量+共享内存)
  19. Visual Studio Code 保存时自动格式化的问题
  20. hdu 2119 Matrix(二分匹配)

热门文章

  1. 【iOS-Android开发对照】之 数据存储
  2. YY前端笔试总结
  3. MySQL具体解释(19)----------海量数据分页查询优化
  4. linux之iptable案例
  5. Web前端开发工程师为什么讨厌IE6!
  6. zoj 1109 zoj 1109 Language of FatMouse(字典树)
  7. JavaSE复习日记 : 八种基本数据类型
  8. WebAppScaner
  9. 射频识别技术漫谈(7)——ID卡
  10. angulajs 当input使用 bootstrap的email类型时,如果是无效的email格式,则ng-model无效的情况