1 引用传递与值传递
- 值传递
调用函数时,将实际参数复制一份传递到函数中,函数中修改形参时,不会影响实际参数。 - 引用传递
调用函数时,将实际参数的地址直接传递到函数中,函数中修改形参时,实际参数会同步改变。
2 引用传递
2.1 Test
package function;
import common.entity.UserEntity;
import java.util.logging.Logger;
public class DataTransmitTest {
private static final Logger logger = Logger.getLogger("DataTransmitTest");
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;
public class DataTransmitTest {
private static final Logger logger = Logger.getLogger("DataTransmitTest");
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 小结