值传递和引用传递(地址传递)的区别
也许大家被值传递和引用传递(看了些别人的博客也有人说只有值传递)弄得傻傻分不清楚,我个人之前也是这样过来的,自己也思考了一番,后来才弄清楚了,结合大多数人的想法总结:
八大基本数据类型:(byte, boolean, char, short, int, long, float, double)
值传递
引用类型:(数组, 类, 接口)
地址传递
我觉得大家也都知道以上的知识点,但是面对编程题还有自己写编程的时候还是出现了返回的值到底是多少的问题,下面是个人用代码编写的程序:
编码实现的功能是在数组的任意位置插入一个整形数值。
System.out.println(arr)是为了调试信息(显示在堆空间的地址)添加的。
package com.sxt.www;
import java.util.Arrays;
public class Text01_insert {
public static void main(String[] args) {
int[] arr = new int[]{11, 22, 33, 44, 55};
System.out.println(arr);
System.out.println(Arrays.toString(arr));
insertPosition(arr,2,66);
System.out.println(Arrays.toString(arr));
}
public static void insertPosition(int[] arr,int index,int num) {
int[] newArr = new int[arr.length + 1];
System.out.println(newArr);
System.arraycopy(arr, 0, newArr, 0, index);
newArr[index] = num;
System.arraycopy(arr, index, newArr, index + 1, arr.length -index);
arr = newArr;
System.out.println(arr);
}
}
执行结果如下:
[I@1554909b
[11, 22, 33, 44, 55]
[I@6bf256fa
[I@6bf256fa
[11, 22, 33, 44, 55]
显而言之,虽然它是数组,属于引用类型,但是传回来的值竟然没有变化,是不是感觉违反了一开始总结的知识点,细看代码可以发现,形参里传入了实参的数组,就表明复制了一份变量名为arr的数组给了insertPosition(),当我们在主方法打印数组元素的时候,复制后的代码的确发生了改变,实际上打印的是复制前的原件,所以还是原来的数组元素。
insertPosition方法作用完之后会释放栈空间,而非改变主方法中的arr。
接下来看一下以下面的代码,只是改了一下位置,定义了一个全局变量arr数组。
public class Text01_insert {
static int[] arr;
public static void main(String[] args) {
arr = new int[]{11, 22, 33, 44, 55};
System.out.println(arr);
System.out.println(Arrays.toString(arr));
insertPosition(2,66);
System.out.println(Arrays.toString(arr));
}
public static void insertPosition(int index,int num) {
int[] newArr = new int[arr.length + 1];
System.out.println(newArr);
System.arraycopy(arr, 0, newArr, 0, index);
newArr[index] = num;
System.arraycopy(arr, index, newArr, index + 1, arr.length -index);
arr = newArr;
System.out.println(arr);
}
}
运行结果如下:
[I@6cd8737
[11, 22, 33, 44, 55]
[I@22f71333
[I@22f71333
[11, 22, 66, 33, 44, 55]
上面只做了参数的变化,就将值传递变为了地址传递,因为newArr将自身的地址值传递给了全局变量arr,所以按照main主方法的顺序原则下,打印出来的结果就是地址传递后的结果,换句话说全局变量int[] arr的地址从原来分配给的地址[I@6cd8737经过newArr的地址传递后变成了[I@22f71333,所以newArr的值为多少,arr的值就为多少。
图解法:
总结
具体问题该具体分析,只要注意它是否传的是地址,然后判断传的地址是否一样,是不是两个不相同的地址就可以辨别出来了,利用图解法可以更容易的进行理解。