易混问题总结---(by value VS by reference)

时间:2021-05-08 04:03:01

传值与传址;
在java中基本型别的传递是通过传值完成的,因此在下面的例子中虽然在Atest()中改变了
传入的int i的值,但是并不会影响原来int i的值,简单点就是传入的int i的值的拷贝罢了
而引用(reference)的传递呢?就有点不同了,在Atest()中的改变影响了原来的对象是内容,
因为在java中reference的传递是by value的,也就是是说,是传递的reference的的拷贝,
+===========内存分配图============+

Object o1 = new Object();
Object o2 = new Object();
+----------此时,存储空间的分配----------+
易混问题总结---(by value VS by reference)

o1=o2
+----------此时,存储空间的分配----------+
易混问题总结---(by value VS by reference)

此时,将o2的reference的值传递给了o1,因此,现在o1指向的对象是一开始o2指向的对象
了,如果现在改变o1的对象,那么对任何一个调用该对象的方法来讲都是可见的(当然了,o2指向的
也会相应改变了,同一个嘛),所以在下面的例子中:Atest()中po的改变在最后一个println()中表现了出来
+-------------------Example--------------------- ----------------+
import java.awt.Point;
class Passvalue
{
  public static void Atest(Point p,int i){
  p.setLocation(2,2);
  i=12;
  System.out.println("During Atest p = " +p+"/n and i = "+i);
}
public static void main(String arg[]){
  Point po = new Point(0,0);
  int j = 0;
  System.out.println("Before Atest p = " +po+"/n and i = "+j);
  test( po, j);
  System.out.println("After Atest p = " +po+"/n and i = "+j);
}
}
---------- output ----------
Before Atest p = java.awt.Point[x=0,y=0]
 and i = 0
During Atest p = java.awt.Point[x=2,y=2]
 and i = 12
After Atest p = java.awt.Point[x=2,y=2]
 and i = 0

输出完成 (耗时 0 秒) - 正常终止
+-------------------------------------------------------------+