Java语言中存在的两种传递方式:
值传递:在方法调用中,只传递参数的值而与地址无关,传递参数并不使地址发生改变,因此调用后存在值相同但地址不同的现象。
地址传递:直接将地址传递,此时修改地址内的值原参数的值也将随之改变,因此调用后两个参数的值一起变化,且地址相同。
要理解值传递与地址传递的区别首先要理解Java内存空间的分化:
Java内存空间由两部分组成:“栈”和“堆”。通俗地说,地址一般存储在“堆”内,而值则存储在“栈”内。
值传递
public class Test1{
public static void main(String[] args) {
int sorse = 100;
System.out.println(sorse);//100
test(sorse);
System.out.println(sorse);//100
}
public static void test(int num) {
System.out.println(num);//100
num = 0;
}
}
其结果输出为100 100 100。
代码中的传递为值传递,传递过程中num在“栈”内开辟了新的空间,将sorse的值传递进去。最后的num赋值为0并不改变sorse的值,他们的地址并不相同。
地址传递
public class Test2{
public static void main(String[] args) {
int sores [] = {100};
System.out.println(sores);
System.out.println(sores[0]);//100
test(sores);
System.out.println(sores[0]);//0
}
public static void test(int [] array) {
System.out.println(array);
array[0] = 0;
}
}
其结果输出为:db9742 100 db9742 0。
由此观之,两数组地址相同,改变array内的值sores内的值随之改变,原因是改变的是地址内的值。
总结
对于基本数据类型参数,传递的是实参的值。
对于数组类型参数,参数值是数组的引用,给方法传递的是这个引用,即内存地址。故可以把数组作为参数传递到方法中改变数组。