函数调用中的值拷贝和地址拷贝的注意事项.拿数据交换为例子讲解.
package com.zr.demo01;
import java.util.Arrays;
//函数调用中的值拷贝和地址拷贝的注意事项.拿数据交换为例子讲解.
/*函数定义参数叫形参,函数调用参数是实参,如果是基本数据类型,那么函数调用时会将实参的值
拷贝一份给形参,做函数的业务功能,函数执行结束后,形参销毁,形参发生改变,实参不改变,值拷贝
函数的参数如果是复杂数据类型,真实数据存在堆里,那么实参和形参里面保存的都是地址,形参发生改变,
实参也改变,这种成为引用拷贝或者地址拷贝*/
public class Ninth {
public static void main(String[] args) {
//没有交换失败
//原因:函数调用只是调用了值而已,并没有让main函数里面的num1和num2发生改变
int num1 = 10;
int num2 = 20;
System.out.println("交换之前的数据:num1=" + num1 + ",num2=" + num2);//交换之前的数据:num1=10,num2=20
change(num1, num2);
System.out.println("交换之后的数据:num1=" + num1 + ",num2=" + num2);//交换之后的数据:num1=10,num2=20
//交换成功
//原因:数组存储在堆里面,函数调用时传入了地址,改变同一个地址的数组,所以交换成功
System.out.println("======================================");
int[] arr = { 10, 30, 20, 40 };
System.out.println("交换之前数组的数据:" + Arrays.toString(arr));//交换之前数组的数据:[10, 30, 20, 40]
change(arr);
System.out.println("交换之后数组的数据:" + Arrays.toString(arr));//交换之后数组的数据:[30, 10, 20, 40]
//交换失败
//原因:调用change函数时,arr1和arr2时新的数组,并未让main函数里的array1和array2发生改变,所以交换失败
System.out.println("======================================");
int[] array1 = { 1, 2, 3, 4, 5 };
int[] array2 = { 6, 7, 8, 9, 10 };
System.out.println("交换之前数组的数据:" + Arrays.toString(array1));//交换之前数组的数据:[1, 2, 3, 4, 5]
System.out.println("交换之前数组的数据:" + Arrays.toString(array2));//交换之前数组的数据:[6, 7, 8, 9, 10]
change(array1, array2);
System.out.println("交换之后数组的数据:" + Arrays.toString(array1));//交换之后数组的数据:[1, 2, 3, 4, 5]
System.out.println("交换之后数组的数据:" + Arrays.toString(array2));//交换之后数组的数据:[6, 7, 8, 9, 10]
}
public static void change(int num1, int num2) {//num1和num2的值交换
int temp = num1;
num1 = num2;
num2 = temp;
}
public static void change(int[] arr) {//数组的一个数和第二个数交换
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
public static void change(int[] arr1, int[] arr2) {//arr1和arr2长度一样
int[] temp = new int[arr1.length];
temp = arr1;
arr1 = arr2;
arr2 = temp;
}
}