函数调用中的值拷贝和地址拷贝的注意事项.拿数据交换为例子讲解.

函数调用中的值拷贝和地址拷贝的注意事项.拿数据交换为例子讲解.

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;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值