一、值传递
值传递,是在栈内存里边存放值。
public class Test {
public static void main(String []args) {
int x=10;
method(x);
System.out.println("x=" + x);
}
public static void method(int mx){
mx =20;
}
}
程序运行结果为 10。具体的内存占用分析如下图:
前两节我们有说到,在方法中定义或者方法的参数都属于局部变量,存放在栈内存中。因此,这里的 x 与 mx 都属于局部变量。
method( )函数将 x 的值传给了 mx,但是 method() 函数内部,mx 又被赋值为 20。所以,被改变的是 mx 这个局部变量,x 的值并没有被改变。
二、引用传递
引用传递,变量在栈内存里边存放的是地址,堆内存里边。
public class Test {
public static void main(String []args) {
Duck d = new Duck();
method(d);
System.out.println("Duck age=" + d.age);
}
public static void method(Duck duck){
duck.age =5;
}
}
class Duck{
int age = 2;
}
程序运行结果为 5。具体的内存占用分析如下图:
在类中定义的变量属于成员变量,存放在堆内存。最开始 new得到的 d对象的成员变量age的值是 2。调用method方法时将对象 d 传递为method的参数duck,duck在栈内存里存放与d相同的内容,即指向age的堆内存地址。然后,在method方法内部,duck对象修改了成员变量age为 5。
三、String传递
String传递是特殊的引用传递。
public class Test {
public static void main(String []args) {
String name = "小飞";
method(name);
System.out.println(" name = " +name);
}
public static void method(String sname){
sname = "小备";
}
}
这个时候,堆内存存放的地址会发生改变。