方法(函数)的参数传递目前分为两种方式:
1.值传递(call by value):表示方法接收的是调用者提供的值;
2.引用传递(call by reference):表示方法节油的是调用者传递的引用(内存地址);
其实还有一种是按照名字传递的(call by name),不过已经成为历史,不再讨论。
那么,Java是按照什么方式进行传递的呢?
先看代码:
public class Test {
public static void main(String[] args) {
int x = 10;
raise(x);
System.out.println("结果:"+x);
}
private static void raise(int x){
x = 3*x;
}
}
//结果:10
可以很清楚看到x的值还是10! 其实,raise()方法中的参数只是接收到x的值得一个拷贝,不是真正的x;在方法内部只是改变了x的拷贝的值,x的值没有改变。
但是,在传递给raise()一个Apple对象会怎样呢?
public class Test {
public static void main(String[] args) {
Apple x = new Apple();
x.size = 1;
raise(x);
System.out.println("结果:"+x.size);
}
private static void raise(Apple a){
a.size = 10;
}
}
class Apple{
int size;
}
//结果:10
可以看到,Apple对象的size变了!这又是为什么呢? 这个时候,传递的参数也是按值传递的,传递的是Apple对象x引用的拷贝,就是方法参数a是x引用的拷贝,他们同事指向同一个对象Apple;当a对Apple对象更改时,x引用的Apple当然也会更改!
最后证明:
public class TestValuePass {
public static void main(String[] args) {
Apple a1 = new Apple(10);
Apple a2 = new Apple(20);
swap(a1,a2);
System.out.println("Apple-1=="+a1.getSize());
System.out.println("Apple-2=="+a2.getSize());
}
private static void swap(Apple a1,Apple a2){
Apple temp = a1;
a1 = a2;
a2 = temp;
}
}
class Apple{
private int size;
public Apple(int size) {
super();
this.size = size;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}
//Apple-1==10
//Apple-2==20
swap()方法在交换两个对象的引用,但是最终是没有成功的!
所以,很明确的认识到Java是按值传递的!