------- android培训、java培训、期待与您交流! ----------
看如下代码1:
public class Demo {
public static void main(String[] args) {
int a=1,b=9;
System.out.println("调用前:a="+a+" b="+b);
change(a,b);
System.out.println("调用后:a="+a+" b="+b);
}
public static void change(int a,int b){
a=a^b;
b=a^b;
a=a^b;
System.out.println("方法内:a="+a+" b="+b);
}
}
运行结果:
调用前:a=1 b=9
方法内:a=9 b=1
调用后:a=1 b=9
对于很多初学者来说,都会被类似于此的参数传递的问题难住吧,我是在听完基础班老师的讲解后才完全弄明白的。
方法的参数传递有两种:值传递和引用传递-----------(注意栈内存和堆内存的数据存储)
基本数据类型的数据存储在栈内存中,引用数据类型的数据存储在堆内存中。
(1)方法的值传递:方法的形参如果是基本数据类型,
· 将值复制,传递到方法内部
在方法内部如果更改值,不影响原值
(2)方法的按引用传递:方法的形参如果是引用类型
将“引用(即堆内存中的地址值)”复制,传递到方法内部
此时原引用和方法内部的引用都指向同一块在堆中的空间
如果在方法内部通过引用将堆中的值更改,原引用所获取的值将同时发生更改
将上面的代码修改一下
代码2:
public class Demo {
public static void main(String[] args) {
int[] arr={0,1};
System.out.println("arr[0]="+arr[0]+" arr[1]="+arr[1]);
change(arr);
}
public static void change(int[] arr){
arr[0]=arr[0]^arr[1];
arr[1]=arr[0]^arr[1];
arr[0]=arr[0]^arr[1];
System.out.println("方法内:arr[0]="+arr[0]+" arr[1]="+arr[1]);
}
}
运行结果:
调用前:arr[0]=0 arr[1]=1
方法内:arr[0]=1 arr[1]=0
调用后:arr[0]=1 arr[1]=0
看代码1,传递给形参的数据是基本数据类型,将值复制赋给change(inta,int b)中的a和b,
a和b是change(inta,int b)内部的局部变量,他们的改变不影响主函数里的a,b值。
代码2传递给形参的是数组arr[]的内存地址,他们指向的都是堆内存里的同一块内存空间,当里面的值发生改变时,只要是这个数组的引用,都会受到影响。