在调用一个有参方法时我们会传递参数,如果方法外我们定义了这个参数,调用的方法内对这个参数做了操作,那么调用方法之后原来的这个参数有没有改变呢?举个栗子。
1,首先方法的参数是基本类型的数据。
public static void main(String[] args) {
int a = 1;
int b = 2;
changeValue(a,b);
System.out.println(a);
System.out.println(b);
}
/*
*参数是基本类型
*/
public static int changeValue(int a,int b){
a = a + 1;
b = b + 1;
return a;
}
上面这种情况a 还是1,b还是2,为什么没有变呢?因为main方法里面的a和b是main方法里面的,跟changeValue里面的a和b不是一回事,changeValue里面的a和b,他可以叫a和b,也可以叫c和d,随便。所以怎么修改都是在changeValue里面,和main里面的没有关系。其实还涉及到堆和栈的问题,画个图。
main方法时程序的入口,所以程序运行时,main方法首先进入栈,给a, b赋了值,然后就执行了changeValue,这时候穿进去的是1,2,然后在changeValue里面,让a = a +1 ,b = b +1,完事之后changeValue 这个方法就结束了,他就从栈里面出去了,没他事了,main方法继续往下走,所以,跟他的a和b有啥关系呢,也没有给a和b赋值,所以没变。
2,方法类型是引用类型的时候
我们都知道,引用类型的数据,数据的内容是存在堆内存的,而引用类型的变量名在栈内存中。先举个栗子。
public static void main(String[] args) {
int[] arr = {2,3,5};
System.out.println(arr[1]);
changeValue(arr);
System.out.println(arr[1]);
}
/*
*参数是引用类型
*/
public static void changeValue(int[] arr){
arr[1] = 6;
}
此时我们的参数类型是个数组,也就是个引用类型的,那么我们第一次输出的是3,第二次输出的却是个6,为什么?放张图解释一下
首先在main方法里面定义了一个数组arr,他的内容是{2,3,5},这个内容就在堆内存里了,这个arr只是指向堆内存他的内容的地址。当调用changeValue的时候,把arr,也就是指向堆内存内容的地址给了changeValue,这时候在changeValue里面对arr[1]进行赋值,他就会顺着这个地址到堆内存中,改的就是堆内存中这个数组的第二个值,所以当执行完changeValue之后,堆内存的内容已经变了,再输出arr[1]时,就是改变后的6了。
总结:当参数是基本类型时,随便改,改完以前是啥样还是啥样,当是引用变量时就会变了,因为已经把堆内存中内容改了。