Java 指针or引用?

由一个问题引出:Java到底是传引用还是传值?

如果是传引用,那么为何badSwap函数并没有如预想的那样交换变量?

 1 public void badSwap(int var1, int var2)
 2 
 3 {
 4 
 5     int temp = var1;
 6 
 7     var1 = var2;
 8 
 9     var2 = temp;
10 
11 }

如果是传值,那么为何tricky函数能够改变外部变量的值?

 1 public void tricky(Point arg1, Point arg2)
 2 
 3 {
 4 
 5     arg1.x = 100;
 6 
 7     arg1.y = 100;
 8 
 9     Point temp = arg1;
10 
11     arg1 = arg2;
12 
13     arg2 = temp;
14 
15 }
16 
17 public static void main(String [] args)
18 
19 {
20 
21     Point pnt1 = new Point(0,0);
22 
23     Point pnt2 = new Point(0,0);
24 
25     System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);
26 
27     System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
28 
29     System.out.println(" ");
30 
31     tricky(pnt1,pnt2);
32 
33     System.out.println("X: " + pnt1.x + " Y:" + pnt1.y);
34 
35     System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
36 
37 }

 

从以上两个例子我们可以看出,传向函数的引用实际上是原始引用的副本(Java复制并传递了“引用”的值)。因此,方法中对对象成员变量的修改会生效,但因为方法中的引用时原始引用的副本,所以对象交换就没有起作用。

其实,Java中所谓的引用和C++中引用的概念并不一样。C++中引用初始化后不可以修改(作为某个对象永久的别名),而Java中的引用可以指向其他的对象。至此,或许更好理解的一种方式是将Java中的“引用”理解为更加友好的但退化了的指针。友好是指在其使用时可以和指针一样操纵对象值,退化指的是不存在指针操作。总而言之,Java中的引用是对程序员来说更为好用的一种“指针”。

参考:http://www.importnew.com/3559.html

posted @ 2013-06-20 11:03  infinityu  阅读(304)  评论(2编辑  收藏  举报