基本数据类型和引用数据类型作为方法参数传递的区别

结论

基本数据类型作为方法参数传递的时候,传递的是值,并不是基本数据类型所存的地址。
引用类型作为方法参数传递的时候,传递的是引用,当我们通过引用改变变量的内容的时候,由于两个对象的地址指向同一块内存区域,所以可以成功改变值。

案例

基本数据类型

对于int基本类型以及他的包装类(考虑到Integer的缓存地址(-128~127),设置的值大一点),传递的是值,通过方法改变参数不能实现。特殊的,String类型是final修饰的,也不能通过方法修改值(当然,String类型其他的方法也不能修改哈哈哈哈,不是因为这个原因)

    public static void main(String[] args) {
        Integer x = 1300;
        int y = 1;
        String str = "hello";
        help(x, y, str);
        System.out.println(x + ", " + y + ", " + str);
    }
    public static void help(Integer x, int y, String str){
        x = x + 1;
        y = y + 1;
        str = str + " world!";
    }
	// 输出
	1300, 1, hello

引用类型作为方法参数传递

    public static void main(String[] args) {
        int[] arr = new int[]{3,5,6};
        help(arr);
        System.out.println(arr[0]);
    }


    public static void help(int[] arr){
        arr[0] = 100;
    }
	//输出
	100

在jvm中,有三个区域。分别是栈、堆、方法区

栈的作用相当于cpu,定义的各类方法按照先后顺序依次入栈,依次运行类似于进程依次被cpu调用,区别是进程等待的过程是在队列中实现的。

堆的作用是为引用数据类型开辟空间。

方法区负责把各类方法传入,此时方法不会被执行。

下面说一下上面程序运行的过程在JVM中是怎样的。

在程序运行的时候,方法区中调入了class文件、main和change方法

栈中首先main方法入栈,先执行int[] arr = new int[]{3,5,6},这一句可以拆开来看:

首先是int[] arr;然后是arr = new int[]{3,5,6}在栈中执行的是int[] arr,堆中执行的是new int[]{3,5,6},这一句的含义是堆在内存中开辟了一片int数组类型的空间,并且为它赋值为{3,5,6}然后把这个地址赋值给arr这里我们假设地址是0x1111。
紧接着change(arr)语句执行,此时change()方法入栈,并为它传入实参arr, 本质上就是传入了arr数组的地址,那么好了,我们得到他的地址后就相当于可以对这个数组进行修改了,于是在这里修改arr[0]的值会成功。

最后方法运行完,弹栈,程序结束.
基本数据类型和引用数据类型作为方法参数传递的区别_第1张图片

你可能感兴趣的:(基本数据类型和引用数据类型作为方法参数传递的区别)