学过java的都知道基本数据类型是存在栈中的,基本数据类型的传递是按照值传递的。
public class Test{
public static void swap(int x,int y){
x += 10;
y=x;
}
public static void main(String[] args) {
int a = 1;
int b = 2;
swap(a,b);
System.out.println(a); //1
System.out.println(b); //2
}
}
由此可见函数内基本类型的改变不影响main方法中的值,所以基本类型是按照值传递。
有人说对象的传递是按照引用传递,一开始我也深以为然,直到。。。
PS:java的函数都是值传递的。
public static void main(String[] args) {
Integer x = 1;
Integer y = 2;
System.out.println("x=" + x + ",y=" + y);
swap(x, y);
System.out.println("x=" + x + ",y=" + y);
}
public static void swap(Integer a,Integer b){
Integer temp = a;
a=b;
b=temp;
}
结果是
换个对象看看
public class WordUtils {
public static void main(String[] args) {
StringBuffer x = new StringBuffer("1");
StringBuffer y = new StringBuffer("2");
System.out.println("x:" + x.toString());
System.out.println("y:" + y.toString());
swap(x,y);
System.out.println("x:" + x.toString());
System.out.println("y:" + y.toString());
}
public static void swap(StringBuffer a,StringBuffer b) {
a.append(b);
b=a;
}
}
结果是
发现x的值前后发生了变化,y的值没有,这是为什么呢?
函数传入参数时,是传入的是对象参数的地址,此时swap()中a的地址和main中x的地址是一样的,append方法改变了堆内存中的值,因此x值发生了改变。swap中a的地址赋给b,因为java函数是值传递,函数运行后,函数内的局部参数也跟着一起销毁,而y指向堆内存中的值没有发生变化,所以y值不变。
总结,Java里面根本就没有引用传递,就算传递的是对象,那也是拷贝了对象的地址值副本。
总结,Java里面根本就没有引用传递,就算传递的是对象,那也是拷贝了对象的地址值副本。
总结,Java里面根本就没有引用传递,就算传递的是对象,那也是拷贝了对象的地址值副本。