Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2339800
  • 博文数量: 2110
  • 博客积分: 18861
  • 博客等级: 上将
  • 技术积分: 24420
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-05 18:23
文章分类

全部博文(2110)

文章存档

2011年(139)

2010年(1971)

我的朋友

分类: Java

2010-10-27 11:13:42

 Java参数的传递到底是以什么方式进行的,这个问题比较让我困扰。

  有人说Java只有按值传递,但这种解释太过含糊,对于基本类型完全适用,但牵扯到对象,解决不了实际问题。

  前几日,看到一篇英文文章,对这个事情解释的很清楚,转过来,顺便翻译一下。

  ===========我是分割线==========

  Java通过对象的引用来操纵对象,并且对象的所有变量也是引用。但是,Java参数的传递不是通过引用传递的,而是通过值传递。

  以交换函数badSwap()为例:

  Java代码

  public void badSwap(int var1, int var2)

  {

  int temp = var1;

  var1 = var2;

  var2 = temp;

  }

  当badSwap()返回时,作为参数传递进出的两个变量仍保持原来的值。如果把参数类型由int换成Object,方法仍然无效,因此得出Object也是按照值进行传递而非引用。下面就解释其微妙之处。

  Java代码

  public void tricky(Point arg1, Point arg2)

  {

  arg1.x = 100;

  arg1.y = 100;

  Point temp = arg1;

  arg1 = arg2;

  arg2 = temp;

  }

  public static void main(String [] args)

  {

  Point pnt1 = new Point(0,0);

  Point pnt2 = new Point(0,0);

  System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);

  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);

  System.out.println(" ");

  tricky(pnt1,pnt2);

  System.out.println("X: " + pnt1.x + " Y:" + pnt1.y);

  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);

  }

  执行main()函数,我们将看到以下结果:

  Java代码

  X: 0 Y: 0

  X: 0 Y: 0

  X: 100 Y: 100

  X: 0 Y: 0

  方法成功改写了ptn1的值, 但是pnt2和pnt1没有成功交换。这就是困扰的主要原因。在main()函数中,pnt1和pnt2仅仅是对象的引用,当你把pnt1和pnt2作为参数传递给tricky()方法时,Java就把这个引用像传递其他参数一样,按照值进行传递,这意味着传递给函数的参数是原引用(original reference)的一个新副本(method reference)。图1就展示了,当Java把参数传递给函数后,这两个引用指向同一个对象。


图1:当Java把参数传递给函数后,这两个引用指向同一个对象

  Java复制并按值传递引用,而非对象本身。因此,原引用指向原对象时,方法就能改变原对象的值。如果引用仅是一个副本,则交换函数失效。如图2所示引用的副本进行了交换,而非原引用。方法被调用后,得到的是没有进行交换的原引用。可以在函数体外对原引用进行交换,以实现成功的交换。


图2:引用的副本进行了交换,而非原引用

阅读(562) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~