欢迎访问宙启技术站
智能推送

Java中参数传递的是值还是引用?详解函数中的参数传递机制

发布时间:2023-06-23 12:03:01

在Java中,参数传递可以是传递值或者引用。这取决于参数的类型和函数定义时的参数声明。

1. 基本类型的参数传递

对于基本数据类型(例如int、double、boolean等),参数传递的是它们的值。这意味着,当函数被调用时,实参的值会被复制到形参中。因此,形参和实参是两个不同的变量,它们的改变互不影响。

下面是一个例子:

public class Main {
    public static void main(String[] args) {
        int value = 10;
        System.out.println("Before calling method: " + value);
        incrementByOne(value);
        System.out.println("After calling method: " + value);
    }
    
    public static void incrementByOne(int num) {
        num++;
        System.out.println("Inside method: " + num);
    }
}

输出结果为:

Before calling method: 10
Inside method: 11
After calling method: 10

在这个例子中,我们传递了一个int类型的实参(value),在函数incrementByOne中对它进行了加1操作,但是在调用函数后,实参(value)的值并没有改变。这是因为参数传递的是值,而不是引用。

2. 引用类型的参数传递

对于引用类型(例如数组、字符串、自定义对象等),参数传递的是它们的引用。这意味着,当函数被调用时,实参的地址会被复制到形参中。因此,形参和实参都指向同一个对象。如果在函数内部修改了形参指向的对象的状态,实参也会受到影响。

下面是一个例子:

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println("Before calling method: " + Arrays.toString(arr));
        modifyArray(arr);
        System.out.println("After calling method: " + Arrays.toString(arr));
    }
    
    public static void modifyArray(int[] array) {
        for(int i = 0; i < array.length; i++) {
            array[i]++;
        }
        System.out.println("Inside method: " + Arrays.toString(array));
    }
}

输出结果为:

Before calling method: [1, 2, 3]
Inside method: [2, 3, 4]
After calling method: [2, 3, 4]

在这个例子中,我们传递了一个int类型的数组实参(arr),在函数modifyArray中对它进行了元素+1操作,调用函数后,实参(arr)的值也发生了改变。这是因为参数传递的是引用,而不是值。

需要注意的是,对于引用类型,如果在函数内部重新为形参赋值了一个新对象,则实参不会受到影响,因为此时形参和实参指向了不同的对象。例如:

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println("Before calling method: " + Arrays.toString(arr));
        resetArray(arr);
        System.out.println("After calling method: " + Arrays.toString(arr));
    }
    
    public static void resetArray(int[] array) {
        array = new int[]{4, 5, 6};
        System.out.println("Inside method: " + Arrays.toString(array));
    }
}

输出结果为:

Before calling method: [1, 2, 3]
Inside method: [4, 5, 6]
After calling method: [1, 2, 3]

在这个例子中,我们传递了一个int类型的数组实参(arr),在函数resetArray中重新为形参赋值了一个新数组,但是调用函数后,实参(arr)的值没有发生改变。因为参数传递的是引用,形参和实参指向了不同的数组。

总结:

在Java中,参数传递的是值或引用,这取决于参数的类型和函数定义时的参数声明。对于基本数据类型,参数传递的是它们的值,对于引用类型,参数传递的是它们的引用。如果在函数内部修改了引用类型形参指向的对象的状态,实参也会受到影响。如果在函数内部重新为引用类型形参赋值了一个新对象,则实参不会受到影响。