Java 值传递与引用传递
本文最后更新于:2024年3月18日 凌晨
Java 值传递与引用传递
- Java参数传递分为值传递和引用传递,基本类型是值传递,封装的对象时引用传递。
值传递
1 |
|
- 值传递的结果是:false
分析
- flag传入
test()
方法时,jvm实际上是复制了一份参数传入方法中,可以理解成传入方法的参数是temp,值是false - 方法里的
flag = true;
可以理解成给temp赋值true System.out.println(flag);
输出的参数实际上是main方法中定义的flag,跟test()
方法里的temp参数没有关系。- 从内存分配的角度来看,栈中是有两个变量的,一个是main方法中定义的flag,另外一个是在传参时jvm复制的一份flag,我们就叫它temp,不论temp值怎么改变,flag是不会变的。
引用传递
1 |
|
- 引用传递结果:15
分析
- main方法new Person时,jvm在堆中分配了一块内存用于存放Person对象,并且在栈中存放一个person对象,值是指向堆中Person对象的地址。
- 把person变量传入change()方法时,jvm复制了一份person变量,为了便于理解我们叫它temp,temp的值和person是一样的,都是指向堆中Person对象的地址。
- Person对象的属性的值改变时,person变量指向的是Person,所以输出person指向的对象的属性的值,就是改变过后的值。
String参数传递
1 |
|
分析
- jvm在实例化字符串时会使用字符串常量池,把str作为参数传入
change()
方法,jvm复制了一份str变量,为了便于理解我们叫它temp,这个时候str和temp都指向字符串常量池中的"abc” - 当我们给temp变量赋值"bcd”时,jvm会实例化"bcd”并将它放进常量池中,这个过程可以看成是:
temp = new String("bcd");
,这个时候temp指向的是常量池中的"bcd” - 那么当我们输出str时,str指向的仍然是"abc”
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!