java中究竟是传值还是传引用

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  在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

  void method1(){

  StringBuffer x=new StringBuffer(”Hello”);

  this.change(x);

  System.out.println(x);

  }

  void int change(StringBuffer i){

  i.append(” world!”);

  }

[1][2][3][4]

享受每一刻的感觉,欣赏每一处的风景,这就是人生。

java中究竟是传值还是传引用

相关文章:

你感兴趣的文章:

标签云: