理解值传递和引用传递

首先,其实不管是值传递还是引用传递,其实都是值传递,都是副本。就像Think in Java里面说的:

I read in one book where it was “completely wrong to say that Java supports pass by reference,” because Java object identifiers (according to that author) are actually “object references.” And (he goes on) everything is actually pass by value. So you’re not passing by reference, you’re “passing an object reference by value.” One could argue for the precision of such convoluted explanations, but I think my approach simplifies the understanding of the concept without hurting anything (well, the language lawyers may claim that I’m lying to you, but I’ll say that I’m providing an appropriate abstraction).

上面的话其实就是在说,对于对象的形参而言,我们好像是在传递一个对象,然而实际上我们只是传递一个对象的引用(栈空间里)而不是对象本身(堆里的实际对象)。这里我们可以把其称为引用变量,引用变量和值变量都是值传递,都是副本。
这里写图片描述

如果以上还是理解不了大可以将方法参数接收分解为一系列赋值操作。

public class Ref{
    public static void main(String[] args){
      Person p = new Person();
      change(p);
    }
    public void change(Person p){//这里的p其实可以任意取名字,比如a,b,c....
       System.out.println(p);
    }
}

当调用change()时候可等效于这样一个过程:

public void change(Person person = p){//这里就是等效的过程
    System.out.println(person);
}

根据以上理解来看下这个示例:

public class Test{
    public static void main(String[] args) {
        StringBuffer str = new StringBuffer("123");
        change(str);
        System.out.println(str);
    }
    public static void change(StringBuffer str){
        str= new StringBuffer("abc");
    }
}

错误输出:abc
正确输出:123
等效过程:

public class Test{
    public static void main(String[] args) {
        StringBuffer str = new StringBuffer("123");
        change(str);
        System.out.println(str);
    }
    public static void change(StringBuffer str = str){//注意这里的等号左右的str并不是同一个str
        str = new StringBuffer("abc");
    }
}

当调用方法的时候,等号左边的是形参,右边的是你传入的,他们是两个引用变量,他们除了指向同一个对象,并没有其他关系,而在方法内

str = new StringBuffer("abc");

使得形参str指向了新的对象,但传入的str并没有改变。所以最后输出的时候还是123
结论:Java中都是值传递

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值