在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值传递的讲解.谢谢.