首先,Java 应用程序有且仅有一种参数传递机制,即按值传递。
什么是按值传递和按引用传递?
按值传递:
按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。
按引用传递:
按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
Java里,对象是按引用传递的。
public class test {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("good");
StringBuffer s2 = s;
s2.append(" afternoon.");
System.out.println(s);
}
}
结果是:good afternoon.
对象s和s2指向的是内存中的同一个地址因此指向的也是同一个对象。进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的。
而Java 有且仅有一种参数传递机制,即按值传递。
JAVA的引用传进函数时 , 会复制一个引用与实参指向同一对象的引用, 操作的不是同一个引用。
public class test {
static class A{
int num = 10;
}
static void change(A a1) {
a1.num = 20;
a1 = new A();
a1.num = 30;
}
public static void main(String[] args) {
A a = new A();
change(a);
System.out.println(a.num);
}
}
结果是:20
将引用a1作为参数传递到change()方法,注意:这里传递的并不是引用本身,而是一个引用的拷贝。也就是说这时有两个引用(引用和引用的拷贝)同时指向堆中的对象.
因为参数传递是值传递,传递进去的a1是个副本, 在change()方法中,又创建了一个A对象,并将“a1引用的拷贝”指向这个在堆中新创建的对象。
但是,"a1引用的拷贝"已经将堆中的A对象的num属性设置为了20,新建的对象属性num才是30。
所以当main()方法中,打印的结果是20.