Java中参数的传递机制,究竟是值传递还是引用传递?

先说结论:

Java语言中,本质上只有值传递,没有引用传递。

废话不说,咱们直接来看例子:

public class Demo {

    public static void main(String[] args) {
       int i = 10;
       testInt(i);
       System.out.println("调用testInt方法后i的值:"+i);  //10

    }

    public static void testInt(int i){
        i = 1;
        System.out.println("testInt方法内i的值:"+i);  //1
    }

}

这是传递参数为基本数据类型的例子,我们可以看到调用方法后i并没有被改变。

但咱们再来看一个传递参数为引用类型的例子:

public class Demo {

    public static void main(String[] args) {
       
       Person p = new Person();
       p.name = "小米";
       testPerson(p);
       System.out.println("调用testPerson方法后p的值:"+p);   //华为

    }

    public static void testPerson(Person p){
        p.name = "华为";
        System.out.println("testPerson方法内p的值:"+p);   //华为
    }
}

我们可以发现,我们在方法内对传递的p进行修改,竟然修改成功了,这似乎就与我们上个例子的值传递证明起冲突了。

于是就有许多人认为在Java中,传递基本数据类型是值传递,传递引用数据类型则是引用传递,但其实这是错误的。

现在我们如果在方法内添加一句代码:

public class Demo {

    public static void main(String[] args) {
       
       Person p = new Person();
       p.name = "小米";
       testPerson(p);
       System.out.println("调用testPerson方法后p的值:"+p);    //小米

    }

    public static void testPerson(Person p){
        p = new Person();
        p.name = "苹果";
        System.out.println("testPerson方法内p的值:"+p);     //苹果
    }
}

如果按照我们的理解,传递过来的p就是其本身的引用地址。逻辑应该是给p重新创建了一个对象,并对属性进行赋值,两句打印语句应该输出的都是苹果,但实际上并不是,main方法中的p并没有被改变。

这是为什么呢?

在Java语言中,传递的值其实是一份拷贝的地址(与原地址的引用相同,所以直接修改可以改变)。这样来看,我们就不难理解为什么在给p创建新的Person对象时,原先的p没有被改变了,因为我们是给拷贝过来的p创建对象。

总结:

Java的值传递,如果传递实参是基本类型,传递的则是基本类型的字面量值的拷贝;如果传递实参是引用类型,那么传递的是实参所引用的对象地址拷贝。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值