Java:值传递与地址传递(引用传递)区别
值传递(pass by value)是指在调用函数时将实际参数 复制 一份传递到函数中,这样在函数中如果对 参数 进行修改,将不会影响到实际参数。传递对象往往为整型浮点型字符型等基本数据结构。
public class PassByValueReference {
//值传递
public static void main(String[] args) {
int x = 9;
pass(x);
System.out.println(x);
}
private static void pass(int y) {
System.out.println(y);
y=0;
}
}
下为运行结果:(整型y的值变化没有影响整型x的值)
地址传递(pass by reference)是指在调用函数时将实际参数的地址 直接 传递到函数中,那么在函数中对 参数 所进行的修改,将影响到实际参数。(类似于共同体) 传递对象往往为数组等地址数据结构。
public class PassByValueReference {
//地址(引用)传递
public static void main(String[] args) {
int [] x = {9};
System.out.println(x[0]);
pass(x);
System.out.println(x[0]);
}
public static void pass(int [] y) {
y[0] = 0;
}
}
下为运行结果:(数组y的值变化同时影响数组x的值)
(值传递与引用传递在计算机数据结构中用到了栈与堆的知识)
另外,如果还没接触Java中的函数与方法相关知识的,可简单借助赋值理解:(运行结果与上面类似)
public class PassByValueReference {
//值传递(赋值非函方式)
public static void main(String[] args) {
int x = 9;
System.out.println(x);
y = x;
y = 10;
System.out.println(x);
}
}
这里x与y就是基本数据类型,赋值后把x的值传给了y,相当于是复制了一份副本,而不是把整个x(即x地址)给了y。
public class PassByValueReference {
//地址传递(赋值非函方式)
public static void main(String[] args) {
int [] x = {1};
System.out.println(x[0]);
int [] y = x;
y[0] = 0;
System.out.println(x[0]);
}
}
这里x与y是数组,这次的代码中不是简单地令x[0]=y[0],而是直接令x=y,此赋值语句把x的数组地址都给了y,相当于是在“同一条船上”了,一起发生变化,y[0]变了同时x[0]也改变。