background image

Java 开发:Java 中传值与传引用示例

  在 Java 中,事实上底层工作原理不存在传引用的概念,这也象《Practical Java》中所说
的那样,Java 中只有传值。这句话理解起来需要费一定的周折。
  熟悉 C 的程序员都用过指针,对指针可谓爱之深恨之切。指针是指向一块内存地址的
内存数据(有些拗口),也就是说指针本身是一个占用 4 字节内存的 int(32 位系统内),而这
个 int 值恰恰又是另一块内存的地址。比如"hello"这个字串,存放在@0x0000F000 这个地
址 到 @0x0000F005 这 段 内 存 区 域 内 ( 包 括 0x00 的 结 束 字 节 ) 。 而 在 @0x0000FFF0 到
@0x0000FFF03 这四个字节内存放着一个 int,这个 int

 

的值是 @0x0000F000。这样就形成

了一个指向"hello"字串的指针。
  在 Java 中,很多人说没有指针,事实上,在 Java 更深层次里,到处都是大师封装好
的精美绝伦的指针。为了更容易的讲解 Java 中关于类和类型的调用,Java 中出现了值与引

 

用的说法。浅显的来说,我们可以认为 Java 中的引用与 C 中的指针等效(其实差别非常非
常大,但是为了说明我们今天的问题,把他们理解为等效是没有任何问题的)。
  所谓传引用的说法是为了更好的讲解调用方式。基于上面对指针的理解,我们不难看
出,指针其实也是一个 int 值,所谓传引用,我们是复制了复制了指针的 int 值进行传递。
为了便于理解,我们可以姑且把指针看作一种数据类型,透明化指针的 int 特性,从而提
出传引用的概念。
  重申一遍:Java 中只有传值。
  1 所谓传值和传引用
  传值和传引用的问题一直是 Java 里争论的话题。与 C++不同的,Java 里面没有指针的
概念,Java 的设计者巧妙的对指针的操作进行了管理。事实上,在懂 C++的 Java 程序员眼
中,Java 到处都是精美绝伦的指针。
  下面举个简单的例子,说明什么是传值,什么是传引用。
  //例 1

  void method1(){
  int x=0;
  this.change(x);
  System.out.println(x);
  }
  void int change(int i){
  i=1;
  }

  很显然的,在 mothod1 中执行了 change(x)后,x 的值并不会因为 change 方法中将输
入参数赋值为 1 而变成 1,也就是说在执行 change(x)后,x 的值 z 依然是 0。这是因为 x 传
递给 change(int i)的是值。这就是最简单的传值。
  同样的,进行一点简单的变化。
  //例 2