- 值传递
值将内存的单元中的值传给参数,若不接受,内存不发生改变
-
引用传递
将内存地址传递给参数,若对该地址改变值,不需接受,内存就会发生改变
package demo;
public class PassRef {
public static void main(String[] args) {
Obj obj = new Obj();
obj.x = 5;
change(obj); //传递的是地址,直接通过地址找到创建的对象,进而对x进行改变
System.out.println(obj.x);
obj.x = 5;
change3(obj.x); //传递的是一值,改变的是形参的值,而obj.x并没有接收
//obj.x=change3(obj.x); //接收了返回值,输出得3
System.out.println(obj.x);
obj.x = 5;
System.out.println(obj);//第一次输出obj
change1(obj); //传递了一个地址,
/**public static void change1(Obj obj) {
Obj obj1 = new Obj(); //创建了一个新的对象
System.out.println(obj);//第2次输出obj
obj = obj1; //obj指向新的对象obj1
System.out.println(obj);//第3次输出obj
obj.x = 3; //赋值
} //形参失去意义,obj重新指向旧对象obj
*
*/
System.out.println(obj);//第4次输出obj
System.out.println(obj.x);//5
obj.x=change1(obj); //接受值
System.out.println(obj.x);//3
obj.x = 5;
change2(obj.x,obj);
System.out.println(obj.x);//7
}
public static void change(Obj obj) {
obj.x = 3;
}
public static int change1(Obj obj) {
Obj obj1 = new Obj();
System.out.println(obj);//第2次输出obj
obj = obj1;
System.out.println(obj);//第3次输出obj
obj.x = 3;
return obj.x;
}
public static void change2(int x,Obj obj){
obj.x=x+2;
}
public static int change3(int x) {
x=3;
return x;
}
}
class Obj {
public int x;
}
输出结果:
3
5
demo.Obj@70dea4e
demo.Obj@70dea4e
demo.Obj@5c647e05
demo.Obj@70dea4e
5
demo.Obj@70dea4e
demo.Obj@33909752
3
7