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中的引用是对程序员来说更为好用的一种“指针”。