基本类型作为方法参数传递
我们在main中定义了一个int型的变量a,调用change()方法后再打印a的值,会发生改变吗?代码如下:
public static void main(String[] args) {
int a = 10;
change(a);
System.out.println(a);
}
public static void change(int a){
a = 20;
}
答案是不会。原因是方法的参数在这里传递的只是一个值:10;它并没有真的改变a的值。形象的说就是a这个变量它在被方法调用的时候,他没有把它自己全部奉献给方法,只是把他的数值10给了它,所以方法并不能改变他。那么如果方法中的参数是数组类型呢?
引用类型作为方法参数传递
main方法中是这样的://伪代码
void main(String[] args){
int[] arr = new int[]{3,5,6};
change(arr);
println(arr[0]);
}
其中change()方法的定义如下:作用是改变数组第0个元素的值
void change(int[] arr){
arr[0] = 100;
}
我们来观察一下arr[0]的值是否发生了改变?
答案是变化了!!!
下面具体看一下流程:
在jvm中,有三个区域。分别是栈、堆、方法区
栈的作用相当于cpu,定义的各类方法按照先后顺序依次入栈,依次运行类似于进程依次被cpu调用,区别是进程等待的过程是在队列中实现的。
堆的作用是为引用数据类型开辟空间。
方法区负责把各类方法传入,此时方法不会被执行。
下面说一下上面程序运行的过程在JVM中是怎样的。
在程序运行的时候,方法区中调入了class文件、main和change方法
栈中首先main方法入栈,先执行int[] arr = new int[]{3,5,6},这一句可以拆开来看:
首先是int[] arr;然后是arr = new int[]{3,5,6}在栈中执行的是int[] arr,堆中执行的是new int[]{3,5,6},这一句的含义是堆在内存中开辟了一片int数组类型的空间,并且为它赋值为{3,5,6}然后把这个地址赋值给arr这里我们假设地址是0x1111。
紧接着change(arr)语句执行,此时change()方法入栈,并为它**传入实参arr,**本质上就是传入了arr数组的地址,那么好了,我们得到他的地址后就相当于可以对这个数组进行修改了,于是在这里修改arr[0]的值会成功。
最后方法运行完,弹栈,程序结束!!!

本文探讨了Java中方法参数传递的基本类型和引用类型的区别。对于基本类型,方法内部的修改不会影响到外部变量的值。而对于引用类型,如数组,方法内的修改会影响到原始数组。通过分析JVM的栈、堆和方法区的工作原理,解释了这一现象的原因。

6226

被折叠的 条评论
为什么被折叠?



