Java引用传递深入简出

2023-12-14 15:21:10

Java中的值传递和引用传递:

对基本类型的数据进行操作:

由于原始内容和副本都是存储实际值,并且是在不同栈区,因此形参的操作,不影响原始内容。

对引用类型的数据进行操作,分两种情况:

一种是形参和实参保持指向同一个对象地址,则形参的操作,会影响实参指向的对象的内容。
一种是形参被改动指向新的对象地址(如重新赋值引用),则形参的操作,不会影响实参指向的对象的内容。


问题描述

之前项目中查询与现实数据不一致:

APP 中接收数据代码:

     public static void main(String[] args) {
        // 数据库参数 {1,2,3,4}
        List <Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        bugToList(list);
        // 输出` [1, 2, 5, 4]
        System.out.println(list);
    }

   
    public static void bugToList(List<Integer> list){
        List <Integer> bugList = list;
        bugList.set(2,5);
    }

原因分析:

主要原因是讲list全部赋值到bugList中了:

用我们语法来说就是:方法被调用时是传入的实际值,它在方法被调用前就已经被初始化并且在方法被调用时传入。


解决方案:

我们可以编写时候注意引用的从新赋值:

    public static void main(String[] args) {
        // 数据库参数 {1,2,3,4}
        List <Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        List <Integer> newList = new ArrayList<>();
        //   或者可以直接赋值     newList.addAll(list);
        //list拷贝到newList
        org.springframework.beans.BeanUtils.copyProperties(list, newList);
        bugToList(newList);
        // 输出` [1, 2, 3, 4]
        System.out.println(list);
    }

    public static void bugToList(List<Integer> list){
        List <Integer> bugList = list;
        bugList.set(2,5);
    }

文章来源:https://blog.csdn.net/weixin_45909849/article/details/132741854
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。