Java中的值传递和引用传递是对于谁来说的?

人无远虑,必有近忧,希望我们永远不要停下前进的脚步!


前言

提示:在继续阅读之前请确认

1.你已经从事或者了解过Java语言开发
2.你已经了解了值传递,引用传递的概念
3.本文旨在让你彻底明白Java中为什么是值传递,如醍醐灌顶般


提示:以下是本篇文章正文内容

一、为什么会搞不清楚值传递和引用传递?

咱别的先不多说,举个例子:String str = “同花顺” ,看图,str中保存着“同花顺”所在内存中的地址,也就是说str持有“同花顺"的引用:
在这里插入图片描述

我们都知道将字符串str作为参数传递给函数去调用的时候,str传递的就是“同花顺”所在内存中的地址,也就是传递的是对字符串“同花顺”的引用。
那问题来了,这不是引用传递吗?
Java为什么会嘴硬的说是值传递呢?
别急,我们看示例代码下边的图,和上边的图进行对比

/**
 * @author top
 */
public class Test {

    public static void main(String[] args) {
        
        String str = "同花顺";
        sayHello(str);
    }

    static void sayHello(String arg) {

        System.out.println("hello" + arg);
    }
}

在这里插入图片描述
如图所示,我们所说的引用传递中的引用到底是引用1,还是引用2呢?
也就是我们说的引用传递,值传递的主语到底是谁?

其实我们所说的引用传递的引用指的是对str的引用而不是对字符串"同花顺"的引用,我们所说的值传递的值指的也是str所保存的地址值

所以这也就揭示了为什么在函数中如果对参数进行修改,不会影响到实际参数:

/**
 * @author top
 */
public class Test {

    public static void main(String[] args) {

        String str = "同花顺";
        updateStr(str);
        System.out.println(str); // 输出结果是: 同花顺
    }

    static void updateStr(String arg) {
       arg = "顺子";
    }
}

因为此时函数中的arg指向的不是str,而是str的一个copy,而这个copy里保存的值是指向"同花顺"字符串的引用(也可以说是"同花顺"字符串的地址),当arg改变指向的地址中的值时,不会影响到原来的str。

所以从侧面证明了Java中是值传递,而不存在引用传递,也就是不存在图中的引用1。

所以你明白了吗?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值