值传递
在编程语言中,有值传递和引用传递,而Java中用到的都是值传递
值传递是指在调用方法时将实际参数"复制"一份传递给形参,这样在方法中对形参的修改将不会影响到实 际参数的值。
引用传递是指在调用方法时将实际参数的地址直接传递到形参,那么在方法中对参数所进行的修改,将会 影响到实际参数的值。
在Java中对象名是储存在栈中,对象是储存在堆中,对象名只是储存对象的地址,并不是代表这个对象,所以在将对象名赋值给其他变量时,只是把对象所在堆中的地址赋值,所以当你new多个对象时,其中一个变量改变对象里的值,并不会改变其他对象的值,但是当你两个变量指向同一个对象时(都储存同一个对象地址),其中一个变量改变对象的值,其他变量调用对象的值时,也会改变。
也就是说,只要有new这个关键字出现,就会在堆中创建不同的对象。下面用例子来说明:
public class A {
// 初始化两个属性(成员变量)
public int a = 0;
public int b = 0;
// 创建一个方法
public static void main(String[] ages) {
// 创建一个对象名为q的对象
A q = new A();
// 给a,b赋值
q.a = 1;
q.b = 2;
// 获取a,b的值
int qx = q.a;
int qy = q.b;
// 输出a,b的值
System.out.print("a="+qx);
System.out.println(",b="+qy);
// 创建一个对象名为w的对象
A w = new A();
// 获取a,b的值
int wx = w.a;
int wy = w.b;
// 输出a,b的值
System.out.print("a="+wx);
System.out.println(",b="+wy);
// q赋值给e
A e = q;
// 获取a,b的值
int ex = e.a;
int ey = e.b;
// 输出
System.out.print("a="+ex);
System.out.println(",b="+ey);
}
}
由上面的一个小例子可以清晰看出,main方法中只new了两个对象,q和e都指向同一个对象,所以当q改变a,b的值时,e调用a,b时a,b的值也改变。而调用a,b的值却没有改变。