前言
方法传参机制非常重要,一定要搞的明明白白。
基本数据类型传参机制
分析下面的案例,看看结果会输出什么。
publicclassMethodParameter01 { publicstaticvoidmain(String[] args) { inta=10; intb=20; //创建AA对象 名字 objAAobj=newAA(); obj.swap(a, b); //调用swapSystem.out.println("main方法 a="+a+" b="+b);//a=10 b=20 } } classAA { publicvoidswap(inta,intb){ System.out.println("\na和b交换前的值\na="+a+"\tb="+b);//a=10 b=20//完成了 a 和 b的交换inttmp=a; a=b; b=tmp; System.out.println("\na和b交换后的值\na="+a+"\tb="+b);//a=20 b=10 } }
流程分析:
1)程序运行到 AA obj = new AA(); 时,会创建一个AA对象,名字为 obj。
2)调用AA对象中的swap方法,将 a = 10,b = 20,传给 swap 方法中的a和b。
3)在方法中,先输出了一遍a和b原本的值,然后进行了交换,此时在方法中a和b的值已经互换了。
4)在互换之后,又输出了一遍a和b的值,此时a = 20,b = 10。
5)方法执行完后,在main方法中又输出了一遍a和b的值,此时就要注意这里的a和b是多少。
6)这里的值a = 10,b = 20。
结论:基本数据类型,传递的是值,形参的任何改变不影响实参,所以在swap方法中交换了a和b的值,但不影响a和b在main方法中的值,也可以说,每个方法都在堆中对应一个自己的内存空间,不会互相影响。(注:sout表示输出语句)
引用数据类型传参机制
分析引用数据类型的传参案例,看看会输出什么
publicclassMethodParameter02 { //编写一个main方法publicstaticvoidmain(String[] args) { Bb=newB(); int[] arr= {1, 2, 3}; b.test100(arr);//调用方法System.out.println(" main的 arr数组 "); //遍历数组for(inti=0; i<arr.length; i++) { System.out.print(arr[i] +"\t"); } System.out.println(); } } classB { //B类中编写一个方法test100,//可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化publicvoidtest100(int[] arr) { arr[0] =200;//修改元素//遍历数组System.out.println(" test100的 arr数组 "); for(inti=0; i<arr.length; i++) { System.out.print(arr[i] +"\t"); } System.out.println(); } }
流程分析:
1)给数组arr赋三个值 1, 2, 3,此时会在堆中新开一个地址来存放,也就是堆中0x0011的空间。
2)然后调用test100方法在方法中将arr数组的第一个地址对应的值改为200,也就是 arr[0] = 200。因为是数组引用传递,所以方法test100也会指向0x0011,而导致0x0011中的值也会进行更改。
3)然后在方法test100中遍历数组进行输出,因为此方法指向的内存空间0x0011的值已经进行了更改,所以会输出 200,2,3。
4)方法test100执行完成后,继续执行main方法,再次遍历输出一次arr数组。这里就要注意了,因为两个方法都指向了同一个数据空间,0x0011中的值已经更改,所以在main方法中输出arr数组的也会是 200,2,3。