public class Test {

public static void main(String[] args) {

StringBuffer a = new StringBuffer("A");

StringBuffer b = new StringBuffer("B");

operate(a,b);

System.out.println(a + "," +b);

}

static void operate(StringBuffer x, StringBuffer y) {

x.append(y);

y =x;

}

}



为什么上面的a的值会发生改变呢?



而b的值又不变呢?

不是说java中方法传参数都是传值吗?

解答:

传参的时候,不管传什么,都是一个copy的过程. 简单点说.就是把实参的值拷贝给形参, 方法里面操纵的只是你的形参, 而对实参一点影响都没有..!

基本数据类型是copy值,对象类型是copy的地址.记住这一点,你上面的问题就很好解决了.

拿你的程序说话吧,关于引用问题5楼已经说的很好了

Java code

?

1
2
3
4
5
6
7
8
9
10
11
12
public
class
Test {
publicstatic
void main(String[] args) {
StringBuffer a =new
StringBuffer("A");
StringBuffer b =new
StringBuffer("B");
operate(a,b);
System.out.println(a +","
+b);
}
static
void
operate(StringBuffer x, StringBuffer y) {
x.append(y);
y =x;//这里,只是说明变量y的引用变了,而跟b没有任何关系
}
}

这里, a是指向"A"的.b是指向"B"的.这点应该没有问题.

然而你调用方法的时候把a,b作为参数传进去,那么.这个时候,只是把a的地址copy拷贝给了x,b的地址copy拷贝给了y,

方面里面,x指向的对象发生了变化,变成了"AB",然而a跟x是指向同一个对象的. 下面输出a会是"AB"

“Java中对象一定是引用传递的,所以当不需要传递引用时,可以用clone(),拷贝一个副本进去,”         “  语言是规则,算法是思想”

关于b,看上面的注释,调试下就知道了,当执行到那句代码时.. 现在是x,y,a都指向"AB"这个对象.而b还是始终指向"B"的,始终没有改变..所以才有你下面那个结果..

最新文章

  1. java验证码前台技术
  2. 循序渐进Python3(八) -- 0 -- 初识socket
  3. Volley与XUtils网络请求使用对比,心得,两者基本使用
  4. css文本溢出省略号
  5. 多媒体(4):JPEG图像压缩编码
  6. JS魔法堂:IE5~9的Drag&Drop API
  7. PHP imagecopyresampled 参数图示
  8. SSH框架总结(框架分析+环境搭建+实例源码下载) 《转》
  9. 将真彩色转换成增强色的方法(即RGB32位或RGB24位颜色转换成RGB16位颜色的函数)
  10. [转] Git SSH Key 生成步骤
  11. BZOJ 1029: [JSOI2007]建筑抢修 贪心
  12. poj3411Paid Roads(dfs)
  13. 免安装oracle驱动访问数据库
  14. 如何显示Mac OS X上的隐藏文件和文件夹
  15. 编程器NAND Flash 技术入门
  16. 原生js实现 常见的jquery的功能
  17. dao代码模板
  18. vue之指令
  19. hdoj:2083
  20. hadoop群集 启动

热门文章

  1. android自定义View&&简单布局&&回调方法
  2. WCF 动态调用(1)
  3. Python内置函数之eval()
  4. java - day14 - InnerClass
  5. jcosole使用方法
  6. JBoss高危漏洞分析
  7. Irrelevant Elements UVA - 1635 二项式定理+组合数公式+素数筛+唯一分解定理
  8. 对象中prototype与__proto__与从cinstructor的作用和区别
  9. Android 混淆完全解析
  10. python requests.exceptions.ConnectionError