java参数传递

1、传递方式

        参数传递有两种方式:值传递和引用传递。

  • 值传递:这是 Java 中默认的参数传递方式。当参数以基本数据类型(如 int、char、boolean 等))或不可变对象(如String、整数数组等)的形式传递时,使用的是值传递。在值传递中,方法内部的参数变量是方法调用时传入参数的一个副本。对参数变量的修改不会影响到方法调用时传入的实际参数。
  • 引用传递:当参数以对象的引用(如对象、数组、类的实例等)的形式传递时,使用的是引用传递。在引用传递中,方法内部的参数变量实际上是方法调用时传入参数的一个引用。对参数变量的修改会反映到方法调用时传入的实际参数上。

2、反例代码

package com.ybw.map;

import com.alibaba.fastjson2.JSON;
import com.ybw.dto.UserDTO;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * @author weixiansheng
 * @version V1.0
 * @className MapTest
 * @date 2023/11/21
 **/
@Slf4j
public class MapTest {

    /**
     * @methodName: testMap
     * @return: void
     * @author: weixiansheng
     * @date: 2023/11/21
     **/
    @Test
    public void testMap() {
        Map userDTOMap = new HashMap<>();
        setUserDTOMap(userDTOMap);
        log.info("testMap userDTOMap:{}", JSON.toJSONString(userDTOMap));
    }

    /**
     * 在上述代码中,当我们在方法内部重新赋值userDTOMap时,我们实际上是创建了一个新的Map对象,
     * 并将其地址复制到了原来存放userDTOMap变量地址的地方。这意味着原来的Map对象仍然存在于堆中,
     * 但其地址已经不再由userDTOMap变量指向了。
     *
     * @param userDTOMap
     * @methodName: setUserDTOMap
     * @return: void
     * @author: weixiansheng
     * @date: 2023/11/21
     **/
    private void setUserDTOMap(Map userDTOMap) {
        userDTOMap.put("1", new UserDTO(1L, "weixiansheng"));
        userDTOMap = Map.of("1", new UserDTO(1L, "weixiansheng"), "2", new UserDTO(2L, "weixiansheng"));
        log.info("setUserDTOMap userDTOMap:{}", JSON.toJSONString(userDTOMap));
    }
}

打印日志

[INFO ] 2023-11-21 14:02:48.579 [main] com.ybw.map.MapTest - setUserDTOMap userDTOMap:{"2":{"id":2,"name":"weixiansheng"},"1":{"id":1,"name":"weixiansheng"}}
[INFO ] 2023-11-21 14:02:48.581 [main] com.ybw.map.MapTest - testMap userDTOMap:{"1":{"id":1,"name":"weixiansheng"}}

  在setUserDTOMap我们重新对它进行了赋值,不过没有生效。

修改

java参数传递_第1张图片

  • 对象参数加final修饰。
  • userDTOMap赋值编译就会报错。 

总结

        将对象引用传递给方法时,实际上传递的是对象的引用而不是对象本身。因此,如果在方法内部更改了引用,那么原始对象不会受到影响。

你可能感兴趣的:(java,java)