Java的参数传递

关于Java的参数传递,是一个老生常谈的问题了,引用传递、值传递傻傻的分不清楚是许多程序员经常遇到的问题,那么今天就来聊聊Java中的参数传递。

先来看个例子:

    public static void main(String[] args) {
        int[] arr = {3,4,5,6};
        int num = 5;
        changearr(arr);
        changenum(num);
        System.out.println("arr[0] = " + arr[0]);
        System.out.println("num = " + num);
        
    }
    
    public static void changearr(int[] arr) {
        arr[0] = 1;
    }
    public static void changenum(int num) {
        num = 1;
    }

结果:

arr[0] = 1
num = 5

分析

从上面代码的运行结果不难发现,在传递基本类型时,方法内部并不能改变方法外的变量,而引用类型则会被改变。
那么Java倒底是用的值传递还是引用传递呢?

在《Head First Java》里面曾解释过:

Java在调用方法,传递参数的时候,采用的是pass-by-copy的方法,传递一份内容的拷贝,即传值。

所以说Java用的应该是值传递,那么为什么会出现上面的情况呢?

这就涉及到Java中的两种数据类型了:引用类型和基本类型。

1.基本数据类型

Java中一共分为8种基本数据类型:byte、short、int、long、float、double、char、boolean,其中byte、short、int、long是整型。float、double是浮点型,char是字符型,boolean是布尔型。
上面这段话相信学过Java的人都看过,随便一本讲Java的书都应该有。

2.引用数据类型

Java中有3种引用类型:class类 、interface接口 、array数组。

基本类型和引用类型的区别

下面关键点来了,上面两种数据类型的区别在哪呢?

基本数据类型的变量是存储在栈内存中,而引用类型变量存储在栈内存中,保存的是实际对象在堆内存中的地址,实际对象其实是在堆上的。

啥是堆和栈?如果这都区分不清楚的话,建议还是去看看JVM内存相关的知识,这里就不详细说了。

看到这里应该能明白为什么会出现例子中的情况了吧。

首先,Java确确实实是传值(pass-by-value)的,在上面的例子里,传过去的确确实实也是一个值的copy,但是引用型(Reference Type)变量里面存放的值是对象的地址,那么传递过去的就是原对象的地址。也就是说,在方法中的数组指向的地址和原数组指向的地址是一样的,而我们对数组操作时是操作数组指向的地址段中的内容,方法内和方法外操作的是同一段内存,那么自然改变也是同步的。

好像还是不大好理解,看看《Head First Java》里面的电视机和遥控器的例子吧:

引用类型的对象就相当于一个电视机和遥控器,我们传递的时候是复制了一个一摸一样的遥控器,因此,尽管新旧两个遥控器不是同一个对象,但是两个遥控器都可以控制电视,新遥控器换台,电视机一样会响应。

而基本类型的对象则相当于只有一个遥控器,我们传递的时候依旧是复制了一个一摸一样的遥控器,就算我们把新的遥控器拆掉,原来的遥控器也不会受到丝毫影响。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容