参数传递问题
- 基本类型按值传递(08讲过)
- 引用类型按照内存地址进行传递(一定要先看08再看这章09)
引用类型按照内存地址进行传递
先看一下代码
- Arrays的toString方法来打印数组中的数据
public class Student {
public static void main(String[] args) {
int[] arr={10,20,30,40};
tese(arr);//相当于把数组a堆中的地址作为参数给了tese这个方法。
System.out.println(Arrays.toString(arr));//输出结果是10,100,30,40
}
public static void tese(int[] a){
a[1]=100;
}
}
现在开始吧上述代码拆开讲解,程序开始运行都是从main方法开始运行的,所以main方法运行时,会在栈中开辟一小块栈内存。
下面程序走到int[] a={10,20,30,40},这里要注意,虽然这个数组是在方法里定义的,按理说应该是局部变量,但是数组是一个对象不是变量,而对象是存在堆内存的,相当于在堆内存上开辟一块新空间。,而此时是把堆内存中数组a的地址复制给int[] a了。
接着程序走下一步 tese(arr),在栈中开辟一块 tese()方法的栈内存,把数组a堆中的地址作为参数给了tese这个方法。
接着程序执行tese(int[] a)方法中的 a[1]=100;相当于把100赋值给这个地址的下标为1的这块小内存,也就是把100赋值给数组a中的x001这里。
接着tese(int[] a)方法执行完毕,栈中该方法的栈内存消失。
最后程序执行 System.out.println(Arrays.toString(arr));//输出结果是10,100,30,40
mian方法执行完毕。栈中main方法的内存也会消失。