对于基本类型的传递,我们很容易理解,而对于对象,总让人感觉是按引用传递,看下面的程序:

public class ObjectRef { //基本类型的参数传递

public static void testBasicType(int m) {

System.out.println("m=" + m);//m=50

m = 100;

System.out.println("m=" + m);//m=100

}

//参数为对象,不改变引用的值 ??????

public static void add(StringBuffer s) {  //change方法

s.append("_add");

}

test类里面的:

————————————————————————————————————————————

StringBuffer sMain = new StringBuffer("init");

System.out.println("sMain=" + sMain.toString());//sMain=init

add(sMain);

System.out.println("sMain=" + sMain.toString());//sMain=init_add

//传递进去引用变量;相当于C++中引用传递一样,被调用方法里面改变了,外面也相应地改变了

changeRef(sMain);

System.out.println("sMain=" + sMain.toString());//sMain=init_add

——————————————————————————————————————————————————

//参数为对象,改变引用的值 ?????

public static void changeRef(StringBuffer s) { //changeRef方法

s = new StringBuffer("Java");

}

public static void main(String[] args) {

int i = 50;

testBasicType(i);

System.out.println(i);//i=50

StringBuffer sMain = new StringBuffer("init");

System.out.println("sMain=" + sMain.toString());//sMain=init

add(sMain);

System.out.println("sMain=" + sMain.toString());//sMain=init_add

changeRef(sMain);

System.out.println("sMain=" + sMain.toString());//sMain=init_add

}

}

以上程序的允许结果显示出,testBasicType方法的参数是基本类型,尽管参数m的值发生改变,但并不影响i。

add方法的参数是一个对象,当把sMain传给参数s时,s得到的是sMain的拷贝,所以s和sMain指向同一个对象,因此,使用s操作影响的其实就是sMain指向的对象,故调用add方法后,sMain指向的对象的内容发生了改变。(好好好)

在changeRef方法中,参数也是对象,当把sMain传给参数s时,s得到的是sMain的拷贝,但与add方法不同的是,在方法体内改变了s指向的对象(也就是s指向了别的对象,牵着气球的绳子换气球了),

s重新赋值后,ssMain已经毫无关联,(两个有了不同的指向)它和sMain指向了不同的对象,所以不管对s做什么操作,都不会影响sMain指向的对象,故调用changeRef方法前后sMain指向的对象内容并未发生改变。

(精华精华精华上面那句话)

对于add方法的调用结果,可能很多人会有这种感觉:这不明明是按引用传递吗?对于这种问题,还是套用Bruce Eckel的话:这依赖于你如何看待引用,最终你会明白,这个争论并没那么重要。真正重要的是,你要理解,传引用使得(调用者的)对象的修改变得不可预期。

最新文章

  1. python 基础之数据类型
  2. 2014年百度之星程序设计大赛 - 初赛(第二轮)JZP Set
  3. oracle 错误代码大全
  4. Python 下的unittest测试框架
  5. DB2导入导出数据库数据
  6. 02python算法-二分法简介
  7. Android自学笔记:环境配置
  8. 单片机C语言开发学习笔记---动态的数码管
  9. DIV内英文或者数字不换行的问题 解决办法
  10. hadoop部署小结的命令
  11. python中的对象拷贝
  12. 抓取锁的sql语句-第一次修改
  13. 理解Spring MVC Model Attribute和Session Attribute
  14. 学习前端前必知的——HTTP协议详解
  15. POJ2718 递归套递归
  16. Vue爬坑之vuex初识
  17. SoftMax regression
  18. pycharm failed to create JVM
  19. String 和 StringBuffer、StringBuilder
  20. 面试HashMap之追命5连问

热门文章

  1. 20161210xlVBA一行数据转为四行
  2. html form表单提交后处理返回数据
  3. 小L的区间求和
  4. 远程桌面连接 [Content] 出现身份验证错误。 要求的函数不受支持
  5. 大数据技术Hadoop面试题
  6. SSH框架下载地址
  7. Error:Cannot compile Groovy files: no Groovy library is defined for module 'xxxx' 错误处理
  8. scroll事件的优化以及scrollTop的兼容性
  9. redis的主从复制和高可用集群
  10. 关于LUN和卷的思考