参数传递有两种形式:
1.值传递:
(1)基本类型作为参数传递时,传递的是这个值的拷贝,无论怎样改变这个拷贝,原值是不会变的。
(2)内存解析:当执行int a=10,int b=20后,程序在栈内存开辟一块地值为AD8500,AD8501的内存,里面分别存放10和20,;当执行change()方法时,程序在栈中有开辟一块地址为AD8600,AD8601的内存,将a,b的值传递进来,这时a=10,b=20,执行完a=b,b=a+b后,AD8600,AD8601的值分别为20,30,在该过程中,分别存放a,b所对应的内存没有任何关系,函数调用结束后,内存给chang()函数分配的内存被垃圾回收器回收,而主函数中的值并未变化,即地址AD8500,AD8501的值始终没有变化。
2.对象传递(引用传递):
(1)当对象作为参数传递时,传递的是对象的引用,即对象的地址。
(2)内存解析:当程序执行完int[] arr={1,2,,3,4,5}程序在栈内存中开辟一块编号为AD9500的内存空间用于存放arr[0]的引用地址,里面存放的是堆内存的一块地址(假定为BE2500),可以理解为有一个指针指向了堆内存中编号为BE2500的地址,堆内存编号为BE2500的这个地址存放的才是array[0]的值。---当程序进入change方法后,将arr的值,也就是对象的引用BE2500传了进来。这时,这时,程序在栈内存又开辟了一块编号为AD9600的内存空间,里面存放的值为BE2500,也可以理解为栈内存编号为AD9600的内存中有一个指针,也指向了堆内存中编号为BE2500的内存地址。---这样一来,栈内存AD9500,AD9600都指向了堆内存编号为BE2500的内存地址,执行完chang方法时,数组中的值得到改变,但在堆内存中的地址值不变,调用结束后,编号AD9500仍指向编号为BE2500的堆内存空间,所以打印结果为4.
|