java 值类型与引用类型_「JAVA」同样是参数传递,基本类型和引用类型到底有何不同...

0038c4e764c1a85d46c303e6deb3b6cc.png方法参数的传递

01基本类型参数的传递

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

4e3576ebdc05f4c60c97b69e57d5d6d7.png基本类型参数的传递的案例

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

16f7a92ec9838b41f73e80cca8e1c846.png基本类型参数的传递的案例 运行结果

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

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

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

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

02引用类型参数的传递

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

439457ad49663d1e65c580751713a39c.png引用类型参数的传递的案例

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

390968b39183abc7fd9fa93441c7c959.png引用类型参数的传递的案例 运行结果

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

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

60dae8b7d019b6f19a645c0f7f62960b.png方法参数传递之引用类型

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值