你好杰米 2018-08-07 06:24 采纳率: 87.5%
浏览 6929
已采纳

【JAVA】将参数传入方法,方法内改变了值,出来后又变成null????

图片说明

如图所示我创建了两个list,然后下面将它们放到了方法里面,方法里面我就不截图了,就是调用mybatis的方法,然后进行赋值,我单元测试的时候,进到方法里面,确实赋值了,但是在退出方法的时候,直接又变回了null???

不是引用传递么,为什么感觉变成局部的了??

调用的方法是void无返回值的方法,求解,以前用责任链模式也是对象当参数穿来穿去的,也没出现这种事啊???

  • 写回答

14条回答 默认 最新

  • sunsloth 2018-08-07 08:34
    关注

    因为你传的是null,null是没有地址的,然后你新new出的对象,对新的对象进行的赋值;
    引用传递的意思是把引用的地址传递过去,然后对引用对应的地址的对象进行修改,
    因为变量名称与实例的指向关系没变,修改了实例,变量的使用时的内容自然就变了。
    你可以先把pList,cList 实例化,然后传入通过add方法进行赋值修改。
    不能用=赋值,
    你的程序应该是路线1,null是没有地址的,但是如果是路线2的话,可以把p1,p2传递进去赋值

    图片说明
    测试代码:
    public static void main(String[] args) {
    List pList = new ArrayList();
    List cList = new ArrayList();
    setParams(pList, cList);
    System.out.println(pList);
    System.out.println(cList);
    }

    public static void setParams(List<ProductV0> pList, List<ProductV0> cList){
        ProductV0 p1 = new ProductV0();
        p1.setProId(1);
        p1.setProName("bread");
        p1.setType("food");
        p1.setDesc("delicious");
        List<ProductV0> aaa = new ArrayList<ProductV0>();
        aaa.add(p1);
        pList = aaa;
        cList.add(p1);
    }
    
    static class ProductV0{
        int proId;
        String proName;
        String type;
        String desc;
        public int getProId() {
            return proId;
        }
        public void setProId(int proId) {
            this.proId = proId;
        }
        public String getProName() {
            return proName;
        }
        public void setProName(String proName) {
            this.proName = proName;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public String getDesc() {
            return desc;
        }
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • Ⅶ宗罪 2018-08-07 06:36
    关注

    你在方法中赋值,不代表这个类中的这两个数组就被赋值了,你可以把接下来要进行的操作,写在这个方法里面或者是给这个方法返回值,然后付给上面的
    两个list,否则,在这个页面上,他们永远都是null,再或者是把这两个list单独创建一个类,用到这个list,就单独调用那个类

    评论
  • batter少年 2018-08-07 07:10
    关注

    你在方法内复制null?

    评论
  • 隔壁黎叔叔 2018-08-07 07:22
    关注
       引用数据类型的概念, 你传入方法中的知识这个集合的副本,并不会改变集合本身, 在上类似于ref ,out 之类的传递指针即可改变list的值
    
    评论
  • qq_24248933 2018-08-07 08:05
    关注

    你要先把pList和cList 实例出来,再放到方法参数里吧

    评论
  • 潜流surging 2018-08-07 11:24
    关注

    是不是有aop拦截器导致,传参没有把你传入的list放到方法里面,看下方法内和传入的list内存地址是不是一样的

    评论
  • coder_17 2018-08-07 16:37
    关注

    java只有值传递,方法上传的是引用对象的地址,可以先实例化,再传入方法中

    评论
  • Zmmgz1208 2018-08-08 08:16
    关注

    你在传入方法前,将这两个对象实例化,而不是赋值为null,就可以了

    评论
  • 长沙刘德华 2018-08-08 14:26
    关注

    引用传递、值传递的区别了解一下

    评论
  • iwuxingyun 2018-08-09 07:33
    关注

    java中方法的参数传递的原则是复制。也就是说不管是值传递还是引用传递,参数传递的都是值得拷贝或者是引用的拷贝。所以再方法中你赋值的是list引用的复制体。原引用仍然指向null。如果你传递的是数组的话就可以实现赋值了。因为数组是两层引用结构。

    评论
  • zhangpan_soft 2018-08-10 10:11
    关注

    把两个null改为new ArrayList就ok了

    评论
  • Wu_Menghao 2018-08-13 05:20
    关注

    图片说明

    上面中所用的内存地址值只是为了方便描述和阅读,真正的内存地址值并非如此

    评论
  • qq_29567787 2018-08-13 08:36
    关注

    你这个是在法法里面改变引用了,这个就没有意义了,正确做法是在方法外面先new一个空的集合,然后方法里面add。千万不要在方法里面改变参数引用

    评论
  • little_boy_lm 2018-08-21 15:53
    关注

    pList你要给他对象才行,pList = new ArrayList();这个时候pList才会和new ArrayList()分配的地址绑定,

    评论
查看更多回答(13条)

报告相同问题?

悬赏问题

  • ¥15 请教如何为VS2022搭建 Debug|win32的openCV环境?
  • ¥15 关于#c++#的问题:c++如何使用websocketpp实现websocket接口调用,求示例代码和相关资料
  • ¥15 51单片机的外部中断,按下按键后不能切换到另一个模式
  • ¥15 java连接sqlserver有问题
  • ¥15 yolov8 如何调cfg参数
  • ¥15 这个四人抢答器代码哪儿有问题?仿真程序怎么写?
  • ¥15 burpsuite密码爆破
  • ¥15 关于#ubuntu#的问题,如何解决?(相关搜索:移动硬盘)
  • ¥15 scikit安装之后import不了
  • ¥15 Ros2编译一个使用opencv的c++节点的时候,报了这个错误,请问怎么解决啊