Java参数传递方式

来源:互联网 发布:投资软件靠谱吗 编辑:程序博客网 时间:2024/05/21 16:22

方法(函数)的参数传递目前分为两种方式:
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是按值传递的!

原创粉丝点击