Java参数传递方式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值