java方法是传值还是传引用问题

先下结论:传入基本类型是传值,传入对象是传引用

网上看到有人说java是传值,论据如下

在java中只有一种传递方式,那就是值传递.可能比较让人迷惑的就是java中的对象传递时,对形参的改变依然会影响到该对象的内容。
下面这个例子来说明java中是值传递.

    public class Test {
        public static void main(String[] args) {
            StringBuffer sb = new StringBuffer("hello ");
            getString(sb);
            System.out.println(sb);
        }

        public static void getString(StringBuffer s) {
            //s = new StringBuffer("ha");
            s.append("world");
        }
    }

在上面这个例子中,当前输出结果为:hello world。这并没有什么问题,可能就是大家平常所理解的引用传递,那么当然会改变StringBuffer的内容。但是如果把上面的注释去掉,那么就会输出:hello.此时sb的值并没有变成ha hello. 假如说是引用传递的话,那么形参的s也就是sb的地址,此时在方法里new StringBuffer(),并将该对象赋给s,也就是说s现在指向了这个新创建的对象.按照引用传递的说法,此时对s的改变就是对sb的操作,也就是说sb应该也指向新创建的对象,那么输出的结果应该为ha world.但实际上输出的仅是hello.这说明sb指向的还是原来的对象,而形参s指向的才是创建的对象,这也就验证了java中的对象传递也是值传递。

首先纠正几点
1. 形参s是对变量sb的复制,修改s不会对sb有影响,只是s和sb都指向同一个对象1(地址:0x00000001,值为hello),所以修改s也会修改sb所指向的对象。
2. 进行s = new StringBuffer(“ha”);操作后,为什么sb依旧为hello,而不是ha world,那是因为赋值操作,使变量s所指向一个新的对象2(地址:0x00000002,值为ha),而sb还是指向对象1,所以后面s.append(“world”)操作是修改对象2的内容,对象1不变。最后打印对象1,当然结果是hello。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李昂的数字之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值