首先回顾一下 堆、栈
int age = 22;
String name = newString("shuaibei");

如果,我们分别对 age、name 变量赋值,会发生什么呢?
age = 18;
name = new String("xiaobei");

age 仅仅是将栈上的值修改为 18,而 name 由于是 String 引用类型,所以会重新创建一个 String 对象,并且修改 name,让其指向新的堆对象。(细心的话,你会发现,图中 name 执行的地址我做了修改)
然后,之前那个对象如果没有其它变量引用的话,就会被垃圾回收器回收掉。
这里也要注意一点,我创建 String 的时候,使用的是 new,如果直接采用字符串赋值,比如:
String name = "shuaibei"
那么是会放到 JVM 的常量池去,不会被回收掉。
值传递
public static void main(String[] args) {
int b =20;
change(b);// 实参 实际上的参数
System.out.println(b);
}
//形参 形式上的参数
public static void change(inta){
a=100;
}
结果:20
形参只是实参创建的一个副本,副本改变了,原本当然不可能跟着改变;
引用传递
public static void main(String[] args) {
int[] a={1,2,3};
System.out.println(a[0]);
change(a);
System.out.println(a[0]);
}
public static void change(int[] a ){
a[0]=100;
}
结果:1 100
由于引用传递,传递的是地址,方法改变的都是同一个地址中的值(同一个对象),
原来a[0]指向0x13地址,值是1,
后来在a[0] 指向的也是0x13地址,将值变成了100所以,
再查询a[0]的值的时候,值自然变成了100
总结:
无论引用传递和值传递就是将自己栈中的参数列表中局部参数 copy 后传递过去。(基本数据类型,就是copy数据。非基本数据类型就copy 引用地址。)
所有也有人说 JAVA中 就是值传递。(引用地址也是值)
网友评论