java中的参数传递都是值传递,即只是将实参的副本(复制品)传入方法内,在方法里改变值,参数本身不受到影响。
基本类型:
public class Test
{
public static void swap(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
}
public static void main(String[] args)
{
int a = 6;
int b = 9;
swap(a,b); // a b 的值并没有改变
}
}
main中的a, b值并没有改变,说明swap中的a,b只是main方法中变量的复制品。
在main 中定义了a,b两个局部变量, 在栈里给 a , b 分配空间,并分别赋值,通过swap传递中,也会在栈中分配两个空间来 a1, b1。
所以改变 a1 , b1 并不会影响a,b.
引用类型
public class DataWrap
{
public int a;
public int b;
}
public class B
public static void swap(DataWrap dw)
{
int tmp = dw.a;
dw.a = dw.b;
dw.b = tmp;
System.out.println("swap方法里,a 的属性的值是" + dw.a + "; b的值是" + dw.b);
// dw = null;
}
public static void main(String[] args)
{
DataWrap dw = new DataWrap();
dw.a = 6;
dw.b = 9;
swap(dw);
System.out.println("交换结束后,a的属性值是" + dw.a + "; b的值是" + dw.b);
}
}
在引用类型中 ,
在main方法开始创建了一个DataWrap对象,并定义了一个dw引用变量来指向DataWrap对象,这是基本类型不同的地方。
创建一个对象时,系统内存中有两个实体:对内存保存了对象本身,栈内存中保存了该对象的引用。接着通过程序引用来操作
DataWrap对象,并对该对象a, b 赋值。
在swap中 也会创建一个DataWrap对象,也是指向堆内存里的DataWrap对象。
相当于main 和 swap中的 dw 都指向了堆内存中的DataWrap对象。
所以swap后 main中的 dw 对象 a b 值会改变。
在swap中的最后一行加上 dw = null; 并不会影响main中的dw 。