传值与传址;
在java中基本型别的传递是通过传值完成的,因此在下面的例子中虽然在Atest()中改变了
传入的int i的值,但是并不会影响原来int i的值,简单点就是传入的int i的值的拷贝罢了
而引用(reference)的传递呢?就有点不同了,在Atest()中的改变影响了原来的对象是内容,
因为在java中reference的传递是by value的,也就是是说,是传递的reference的的拷贝,
+===========内存分配图============+
Object o1 = new Object();
Object o2 = new Object();
+----------此时,存储空间的分配----------+
o1=o2
+----------此时,存储空间的分配----------+
此时,将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 秒) - 正常终止
+-------------------------------------------------------------+