Java的值传递

经典问题,众所周知,java是按值传递。

有人说,是传递的地址;
有人说,是传递了一个副本;
有人说基本类型是按值传递,引用类型是引用传递(这尼玛就是扯!)。

思考如下代码,却输出:c。如此矛盾,隐约透出这个是引用传递?
public class StringDemo {
    public static void main(String[] args) {
        String[] x = new String[]{"a", "b"};
        change(x);
        System.out.println(x[0]);   //输出"c"
    }

    public static void change(String[] y) {
        y[0] = "c";
    }
}
解读:
y首先接收x的地址,该地址指向 {"a", "b"},所谓的按值传递。
然后修改y地址指向的内容, {"a", "b"}改为{"c", "b"}。
x的内容自然改变 。


再对比如下代码,输出:a。为何?
public class StringDemo {
    public static void main(String[] args) {
        String[] x = new String[]{"a", "b"};
        change(x);
        System.out.println(x[0]);   //输出"a"
    }

    public static void change(String[] y) {
        y = new String[]{"c", "d"};
    }
}
解读:
y首先接收x的地址,该地址指向 {"a", "b"}。
然后y的地址更改为 {"c", "d"}地址,并未改变 {"a", "b"}的内容。
x的内容不变。


图例堆栈解读,稍后补上。。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值