JAVA中的值传递机制

在Java中,不管值普通的变量赋值还是方法的传参数,都是满足值传递机制的.在说明值传递机制之前,要先了解Java的数据类型.

数据类型

Java中分为基本数据类型和引用数据类型.我们先来说明基本数据类型.

基本数据类型分为4种8个,分别是①int,  byte, short,  long ②double, float ③boolean ④char

基本数据类型内部存储的其实就是数值,如:

int a = 10;
System.out.println(a);

如果是基本数据类型,那么打印出来的结果就是当时存储给它的值.但是引用数据类型并不是.

引用数据类型也有很多种,如String类型,类的对象,数组等等.

引用数据类型在打印的时候打印的其实并不是存储的值,而是地址值,

其实原因也是很简单,就是引用数据类型在创建对象的时候,会在2堆空间申请内存,最后将申请到的空间地址传给了在栈区的变量,所以引用数据类型的变量内部其实是存储的地址值,而这个地址值指向的空间实际存储的就是我们实际存储的数据.

对于引用数据类型,内存申请的基本过程,先是main方法进栈,随后要new一个新的对象,那么就会到堆区申请一个空间,比如:0x1234,在这个空间中存储的就是我的具体内容.最后就把申请的空间的地址值给到在栈区的引用变量.

那么我的引用变量就指向了我的空间.

值传递机制

这里就以方法传参为例.

前面已经说过了,Java的数据类型是分为基本数据类型和引用数据类型,而这两个大类型存储的值又是不同性质的,那么所形成的效果一定不一样.

现时基本数据类型:

这里写了一个方法,其实就是交换两个数,然后在main方法中调用了此方法,如果不理解Java的值传递机制的,一定认为输出的结果是: x = 20, y = 10.

但是其实结果很出人意料.

这里就通过内存图进行讲解,一定会醍醐灌顶.

代码的前两行就是定义两个变量,那么一定会有两块空间来存储值,就如上图2的左侧,随后就调用了func()方法,而这题会让人糊涂的地方就是他在方法内又创建了两个与x,y同名的局部变量,但是要记住,他们永远是不同的空间的数据.方法传参后,那么在方法内的局部变量其实存储的也是10和20.

最后,按照上图左侧的方法将这两个空间中的数据交换.我们是做到的交换,但是其实交换的是上图右侧空间的值,对于main方法中的变量,并没有将它们交换,岁哦一最后打印的结果也是不变的.


引用数据类型的值传递,看看下面这道题的结果是什么?

还是用内存图来分析

首先是创建了一个数组,因为数组也是引用类型,所以会在堆区申请一个内存空间,最后将地址值赋值给arr

之后是调用方法了,也是创建了一个与main方法中与arr同名的局部变量,根据值传递机制,其实是将main方法中arr存储的地址值给了这个局部变量,如上图左侧所示,那么这样两个引用变量就会指向同一块空间,那么我不管是通过哪一个变量(即不论是main方法中的变量,还是这个func()方法中的局部变量)所修改的其实是同一块内存空间.

所以我在调用完func()方法后再打印数据会发现它的值被修改了.

以上就是关于Java值传递的讲解.谢谢.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值