java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JAVA值传递和引用传递

JAVA值传递和引用传递方式

作者:杉莘

文章总结:在Java中,处理不可变集合时,直接修改操作会抛出异常,正确的做法是使用可变集合类型,如ArrayList,或者通过流操作(stream().filter())来实现修改,理解Java方法参数的传递方式(值传递)是关键,这决定了如何正确地修改对象的状态

JAVA值传递和引用传递

ps:

碰到一个业务bug,抛出异常UnsupportedOperationException,检查代码发现在调用链中,listA=ImmutableList.of(xxx);导致listA为不可变List,调用retain()方法抛出异常;

// 原始代码
……
listA.retainAll(listB);
// 修改代码1
listA = listA.stream().filter(listB::contains).collector(Collectors.toList);
……

然后我修改:

listA = new ArrayList<>();
listA.add(xxx);

原因

Java方法参数均为值传递

参数为基本类型

public class Main {
    public static void main(String[] args) {
        // 创建一个整数变量并赋值
        int number = 10;
        // 调用方法并将number传递进去
        changeNumber(number);
        // 输出原始变量的值,仍然是10,未被方法改变
        System.out.println(number);  // 输出: 10
    }
    // 定义一个方法,尝试改变参数的值
    public static void changeNumber(int num) {
        num = 20;  // 这里只是改变了方法内部副本的值
    }
}

参数为引用类型

public class Main {
    public static void main(String[] args) {
        // 创建一个对象
        MyObject obj = new MyObject();
        obj.value = 10;
        // 调用方法并将对象传递进去
        changeObject(obj);
        // 输出对象的值,已被方法改变
        System.out.println(obj.value);  // 输出: 20
		// 调用set方法
		setObject(obj);
		 // 输出对象的值,值不变
        System.out.println(obj.value);  // 输出: 20
    }
    public static void changeObject(MyObject obj) {
        obj.value = 20;  // 这里修改的是对象的实际状态
    }
	public static void setObject(MyObject obj) {
        obj= new MyObjectc();  // 这里修改的是对象的实际状态
    }
    
    static class MyObject {
        int value;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文