background image

  StringBuffer a=new StringBuffer("I am a ");
  StringBuffer b=a;
  a.append("after append");
  a=b;
  System.out.println("a="+a);

  在编程过程中,经常会遇到这种情况,一个变量的值要被临时改变一下,等用完之
后再恢复到开始的值。就好像上面的例子,a 为了保持它的值,使用 b=a 做赋值,之后 a
被改变,再之后 a 把暂存在 b 里面的值取回来。这是我们一厢情愿的想法,而事实上,这
段代码执行后,你会发现 a 的值已经改变了。
  以上是两个最简单的例子,真正的程序开发过程中,比这要复杂的情况每天都会遇
到。
  3 类型和类
  Java 提出的思想,在 Java 里面任何东西都是类。但是 Java 里面同时还有简单数据类
型 : int,byte,char,boolean , 与 这 些 数 据 类 型 相 对 应 的 类 是
Integer,Byte,Character,Boolean,这样做依然不会破坏 Java 关于任何东西都是类的提
法。
  这里提到数据类型和类似乎和我们要说的传值和传引用的问题无关,但这是我们分
辨传值和传引用的基础。
  4 试图分辨传值还是传引用
  为什么是"试图分辨"呢?很简单,传值和传引用的问题无处不在,但是似乎还没有人
能正统的给出标准,怎样的就是值拷贝调用,怎样的就是引用调用。面对这个问题,我们
更多的应该是来自平时积累对 Java 的理解。
  回过头来,我们分析一下上面的几个例子:
  先看例 1,即使你不明白为什么,但是你应该知道这样做肯定不会改变 x 的值。为了
方便说明,我们给例子都加上行号。
  //例 1

  1 void method1(){
  2 int x=0;
  3 this.change(x);
  4 }
  5
  6 void int change(int i){
  7 i=7;
  8}

  让我们从内存的存储方式看一下 x 和 I 之间到底是什么关系。
  在执行到第 2 行的时候,变量 x 指向一个存放着 int 0 的内存地址。
  变量 x---->[存放值 0]
  执行第 3 行调用 change(x)方法的时候,内存中是这样的情形:x 把自己值在内存中
复制一份,然后变量 i 指向这个被复制出来的 0。
  变量 x---->[存放值 0]