java int 引用类型传参_引用类型

方法参数的传递

01基本类型参数的传递

先来看如下的案例,在案例中,定义了int类型变量x,分别在将其传入swap方法之前、之后打印了变量x的值,用于比较变量的值是否被改变。在swap方法中,对变量x进行了重新赋值:

java int 引用类型传参_java int 引用类型传参_02

基本类型参数的传递的案例

运行上述案例后,运行结果如下:

java int 引用类型传参_main方法_03

基本类型参数的传递的案例 运行结果

通过运行结果,不难发现,虽然将变量x传入了swap,并对其做了重新赋值;但也仅仅是在swap方法中,在main方法中的变量x的值仍然是13,并未发生改变,这是为何?

答案可以通过下图来获取到:

java int 引用类型传参_数组_04

方法参数传递之基本数据类型

其实是因为当把变量x作为参数传入swap方法时,JVM会将main方法栈中的变量x的值复制一份,并将复制后的副本传入swap方法,那么,在swap方法中被重新赋值的是副本,并不会对初始值产生影响。

02引用类型参数的传递

对于引用数据类型来说,在参数传递时又会不同的处理;同样得,也有一个案例,在案例中,定义了int类型的数组intArr(数组是引用数据类型),分别在将其传入swap方法之前、之后打印了数组intArr的值,用于比较变量的值是否被改变;而在swap中,会引入临时变量tmp,实现intArr数组中的元素的值的交换。案例代码如下:

java int 引用类型传参_引用类型_05

引用类型参数的传递的案例

运行上述案例,运行结果如下:

java int 引用类型传参_main方法_06

引用类型参数的传递的案例 运行结果

通过运行结果,不难发现,将数组intArr传入swap方法,在swap方法中,引入临时变量tmp,实现了数组intArr中的两个元素的索引位置的交换;在swap方法执行完以后,不同于基本数据类型的是,数组intArr的值被修改了,这又是为何?

不妨可以先来看下图的JVM模型,因为图中有答案:

java int 引用类型传参_引用类型_07

方法参数传递之引用类型

在把数组intArr作为参数传入swap方法时,由于数组intArr是一个对象,对象的值存储在堆中,而堆中的内容是共享的;所以JVM会将main方法栈中的数组intArr的堆内存地址复制一份,并将复制后的副本传入swap方法,虽然会有两个地址,但两个地址引用的都是同一对象,操作任何一个地址,都会修改地址所引用的堆中的值。

完结。老夫虽不正经,但老夫一身的才华