注:此想法来源于刘意老师的Java基础视频,用到的代码和图均出自刘意老师,我只做解释)
附代码:
内存示意图:
1.先讲第一种:基本类型:形式参数的改变对实际参数没有影响
首先在栈中为main方法开辟空间,在其中声明了两个数int a = 10,int a = 20 ,
接着为change(int int )方法开辟内存,并把a,b两个数的值赋给形参
注意:这个时候,change方法中要求输入两个int类型的形参,老师在此出没有写出,应该是change(int x,int y ),然后再将a,b的值在分别赋给x,y,所以最终在change方法的内存中出现的是int a = 10,b=20
紧接着开始执行方法体内的程序,立刻将a变为20,b变为40 .接着将这个结果return回去,change方法就在内存中被回收了,
注意!!!此时,原来的int a 和int b 并没有做任何改变,上面发生的一系列变化,都是在change方法开的内存中进行的
2.再讲第一种:引用类型:形式参数的改变直接影响实际参数。
在main方法中再次开辟内存,创建一个新的变量int[]arr,此时arr是形参,在new一个数组出来时,必须在堆中开辟内存!!用来存放数组中的元素,而这个内存的地址,将他赋值给了arr,,也就是此时arr指向了堆中的一个内存地址。而这个地址中存放着这个数组的各光元素,也就是1,2,3,4,5
接下来,在栈中再次为change(int【】 x)方法开辟内存,这时,将arr的值赋给了x,也就是x也指向了堆中的一块内存,在内存图中写的就是0x0001
此时开始执行change(int[] x)的方法体,而此时是在堆中进行的操作!!!因为此时栈内存中存储的仅仅是一个地址值而已!要想进行方法体内的操作,必须到堆中进行!!!紧接着会将数组中的元素改变!!
在change方法执行完了之后,他的内存就被回收了,不返回值,但是此时数组中的值已经被改变了!!!(无情!!!改了人家的数后,自己溜了!!)而且arr指向的还是那个内存地址,此时这个地址中的值已经变了,所以这个时候在输出的话,int[]arr就不再是{1,2,3,4,5}而是{1,4,3,8,5}
这就是所谓的,引用类型:形式参数的改变直接影响实际参数。