关于方法传入常量参数问题
测试代码
public class TestMain {
public void changeNumber(int number){
System.out.println("方法执行开始"+number);
number=10;
System.out.println("方法执行最终"+number);
}
//main函数程序的入口
public static void main(String[] args) {
//创建一个对象(在内存中会提前加载类模板,加载当前类)
TestMain testMain = new TestMain();//new 会在堆内存中开辟一个空间
int n=1;
//调用方法
//1.方法存在哪里? 存在堆内存的对象空间内
//2.方法的执行? 在栈内存中开辟一块临时的方法执行空间
testMain.changeNumber(1);//需要传入一个int 参数
System.out.println("方法执行完毕,main方法中的n的值为"+n);
}
}
执行结果为
方法执行开始1
方法执行最终10
方法执行完毕,main方法中的n的值为1
通过内存图描述以上过程
通过以上过程可以知道,方法执行完毕后,临时在栈内存开辟空间会销毁,要想将方法中的数据结果得到,需要将数据返回
修改测试代码
public class TestMain {
public int changeNumber(int number){
System.out.println("方法执行开始"+number);
number=10;
System.out.println("方法执行最终"+number);
return number;
}
//main函数程序的入口
public static void main(String[] args) {
//创建一个对象(在内存中会提前加载类模板,加载当前类)
TestMain testMain = new TestMain();//new 会在堆内存中开辟一个空间
int n=1;
//调用方法
//1.方法存在哪里? 存在堆内存的对象空间内
//2.方法的执行? 在栈内存中开辟一块临时的方法执行空间
n = testMain.changeNumber(1);//需要传入一个int 参数
System.out.println("方法执行完毕,main方法中的n的值为"+n);
}
}
运行结果
方法执行开始1
方法执行最终10
方法执行完毕,main方法中的n的值为10
通过内存图描述以上过程
总结形参和实参
- 形参可以理解为是方法执行时的临时变量空间
- 实参可以理解为是方法调用时传递进去的参数
- 方法调用时会将实参内容传递给形参
- 如果传递内容是基本类型,则传递的是值,形参改变,实参不变
- 如果传递的内容是引用类型,则传递的是引用,形参改变,实参跟着改变
方法传入数组类型问题
测试代码
public class TestMain {
public void changeArray(int[] array){
System.out.println("方法执行开始"+array[0]);
array[0]=10;
System.out.println("方法执行结束"+array[0]);
}
//main函数程序的入口
public static void main(String[] args) {
TestMain testMain = new TestMain();
int[] array=new int[]{
1,2,3};
testMain.changeArray(array);
System.out.println("方法执行完毕,main中的数组的第一个值为:"+array[0]);
}
}
测试结果
方法执行开始1
方法执行结束10
方法执行完毕,main中的数组的第一个值为:10
通过内存图描述以上过程
扫描二维码关注公众号,回复:
12392557 查看本文章
方法传入数组值交换的问题
测试代码
public class TestMain {
//将两个数组内的元素对应位置交换
public void changeArray(int[] array1, int[] array2) {
for (int i = 0; i < array1.length; i++) {
//每一次找到一个数组中的元素跟另一个数组对应位置
int temp=array1[i];
array1[i]=array2[i];
array2[i]=temp;
}
}
//main函数程序的入口
public static void main(String[] args) {
//隐藏加载类模板过程
//创建对象
TestMain testMain = new TestMain();
//创建两个数组
int[] array1=new int[]{
1,2,3,4};
int[] array2=new int[]{
5,6,7,8};
//调用方法交换数组元素
testMain.changeArray(array1,array2);
//通过工具类打印数组结果
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
测试结果
[5, 6, 7, 8]
[1, 2, 3, 4]
由于数组引用指向的堆内存空间没变,数组内储存的值已经发生改变,所以结果发生改变
通过内存图描述以上过程
方法中数组引用地址交换问题
测试代码
public class TestMain {
//将两个数组内的引用交换,用临时变量来接收
public int[][] changeArray(int[] array1, int[] array2) {
int[] temp=array1;
array1=array2;
array2=temp;
int[][] result={
array1,array2};
return result;
}
//main函数程序的入口
public static void main(String[] args) {
//隐藏加载类模板过程
//创建对象
TestMain testMain = new TestMain();
//创建两个数组
int[] array1=new int[]{
1,2,3,4};
int[] array2=new int[]{
5,6,7,8};
//调用方法交换数组引用,接收返回结果
int[][] ints = testMain.changeArray(array1, array2);
//将交换完毕的数组引用赋值给原数组
array1=ints[0];
array2=ints[1];
//通过工具类打印数组结果
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
测试结果
[5, 6, 7, 8]
[1, 2, 3, 4]
由于在方法执行时交换数组引用,方法执行完毕时,临时执行方法的空间会被销毁,方法前传入的数组引用未被改变,要想让数组的引用交换成功,就必须存储交换完后的数组引用返回出去,再重新赋值给两个数组