Java基础系列:引用传递与值传递

1 引用传递与值传递

  • 值传递
    调用函数时,将实际参数复制一份传递到函数中,函数中修改形参时,不会影响实际参数。
  • 引用传递
    调用函数时,将实际参数的地址直接传递到函数中,函数中修改形参时,实际参数会同步改变。

2 引用传递

2.1 Test

package function;

import common.entity.UserEntity;

import java.util.logging.Logger;

/**
 * 数据传递测试.
 *
 * @author xindaqi
 * @date 2021-06-21 16:24
 */
public class DataTransmitTest {

    private static final Logger logger = Logger.getLogger("DataTransmitTest");

    /**
     * 引用传递.
     *
     *  @param source 源对象
     */
    public static void referenceTransmit(UserEntity source) {
        UserEntity target = new UserEntity();
        target = source;
        logger.info("方法内,源对象:" + source);
        logger.info("方法内,结果对象:" + target);
        target.setSex("from_target");
        logger.info("方法内,结果对象修改属性:" + source);
        source.setSex("alien");
        logger.info("方法内,源对象修改属性:" + source);
    }

    public static void main(String[] args) {
        UserEntity sourceEntity = new UserEntity("1111", "xiaoxiao", "female");
        logger.info("方法外,源对象-1:" + sourceEntity);
        DataTransmitTest.referenceTransmit(sourceEntity);
        logger.info("方法外,源对象-2:" + sourceEntity);
    }
}

2.2 Debug

  • 初始化
    初始化对象,作为实参,地址为540,详情如图2.1所示。
    在这里插入图片描述
图2.1 初始化实参
  • 复制target=source
    调用函数,将实参赋值给形参,对象的赋值为地址传递,此时形参与实参指向同一块内存。
    方法内新建的对象target地址为700,详情如图2.2所示。
    在这里插入图片描述
图2.2 实参对象赋值实参对象
  • 对象赋值
    形参赋值给新建的对象target,此时,对象间赋值是地址传递,此时新建的对象target与形参对象指向的内存相同540,详情如图2.3所示。
    在这里插入图片描述
图2.3 形参赋值给新对象
  • 形参修改属性
    新对象target修改属性,形参和新对象target指向的地址相同,因此,新对象改变属性时,形参同时发生改变,详情如图2.4所示。
    在这里插入图片描述
图2.4 新对象target修改属性
  • 形参修改属性
    形参与实参指向的内存地址相同,因此,形参修改属性时,实参同步发生改变,详情如图2.5所示。
    在这里插入图片描述
    在这里插入图片描述
图2.5 修改形参

2.3 结果

六月 22, 2021 6:06:04 下午 function.DataTransmitTest main
信息: 方法外,源对象-1:UserEntity{uid=1111, nickname='xiaoxiao', sex='female'}
六月 22, 2021 6:06:04 下午 function.DataTransmitTest referenceTransmit
信息: 方法内,源对象:UserEntity{uid=1111, nickname='xiaoxiao', sex='female'}
六月 22, 2021 6:06:04 下午 function.DataTransmitTest referenceTransmit
信息: 方法内,结果对象:UserEntity{uid=1111, nickname='xiaoxiao', sex='female'}
六月 22, 2021 6:06:04 下午 function.DataTransmitTest referenceTransmit
信息: 方法内,结果对象修改属性:UserEntity{uid=1111, nickname='xiaoxiao', sex='from_target'}
六月 22, 2021 6:06:04 下午 function.DataTransmitTest referenceTransmit
信息: 方法内,源对象修改属性:UserEntity{uid=1111, nickname='xiaoxiao', sex='alien'}
六月 22, 2021 6:06:04 下午 function.DataTransmitTest main
信息: 方法外,源对象-2:UserEntity{uid=1111, nickname='xiaoxiao', sex='alien'}

2.4 分析

  • 初始化

在这里插入图片描述

图2.6 初始化对象
  • 参数传递

在这里插入图片描述

图2.7 参数传递
  • 形参赋值新对象

在这里插入图片描述

图2.8 形参赋值新对象
  • 新对象修改属性

在这里插入图片描述

图2.9 新对象修改属性
  • 形参修改属性

在这里插入图片描述

图2.10 形参修改属性
  • 方法调用结束

在这里插入图片描述

图2.11 方法调用结束

3 值传递

3.1 Test

package function;

import common.entity.UserEntity;

import java.util.logging.Logger;

/**
 * 数据传递测试.
 *
 * @author xindaqi
 * @date 2021-06-21 16:24
 */
public class DataTransmitTest {

    private static final Logger logger = Logger.getLogger("DataTransmitTest");

    /**
     * 值传递.
     *
     *  @param source 源数据
     */
    public static void valueTransmit(int source) {
        int target = source;
        logger.info("方法内,源值:" + source);
        logger.info("方法内,结果值:" + target);
        target = 10;
        logger.info("方法内,源值:" + source);
        source = 10;
    }

    public static void main(String[] args) {
        int sourceInt = 0;
        logger.info("方法外, 源int-1:" + sourceInt);
        DataTransmitTest.valueTransmit(sourceInt);
        logger.info("方法外, 源int-2:" + sourceInt);
    }
}

3.2 Debug

  • 实参初始化
    实参初始化,在内存中生成sourceInt变量。
    在这里插入图片描述
图3.1 实参初始化
  • 形参赋值
    实参传递给形参时,开辟新的内存空间,拷贝实参数值。
    在这里插入图片描述
图3.2 形参赋值

3.3 结果

信息: 方法外, 源int-1:0
六月 22, 2021 6:06:04 下午 function.DataTransmitTest valueTransmit
信息: 方法内,源值:0
六月 22, 2021 6:06:04 下午 function.DataTransmitTest valueTransmit
信息: 方法内,结果值:0
六月 22, 2021 6:06:04 下午 function.DataTransmitTest valueTransmit
信息: 方法内,源值:0
六月 22, 2021 6:06:04 下午 function.DataTransmitTest main
信息: 方法外, 源int-2:0

4 小结

  • 引用传递:形参改变实参
  • 值传递:形参不改变实参

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天然玩家

坚持才能做到极致

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

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

打赏作者

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

抵扣说明:

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

余额充值