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

解析Java函数参数传递方式:值传递VS引用传递

发布时间:2023-08-12 03:39:55

Java中的参数传递方式可以分为值传递和引用传递。值传递是指将实际参数的值复制一份给形式参数,在函数内部对形式参数的修改不会影响到实际参数。而引用传递则是传递实际参数的引用,函数内部对形参的修改也会同步到实参。

首先我们来看一下值传递。在Java中,基本类型的参数传递都是值传递。这是因为基本类型存储在栈中,每个变量都有自己的存储空间。当将一个基本类型的变量作为参数传递给函数时,会将该变量的值复制一份给形参。函数内部对形参的修改不会影响到实参。

例如:

public static void main(String[] args) {
    int num = 5;
    addTen(num);
    System.out.println(num); // 输出:5
}

public static void addTen(int n) {
    n += 10;
}

上述代码中,main函数中的num变量的值为5。当调用addTen函数时,将num变量的值复制一份给形参n。在addTen函数内部对n的修改不会影响到num的值,输出结果仍然是5。

接下来我们来看一下引用传递。在Java中,引用类型的参数传递是按引用传递的。这是因为引用类型的变量存储的是对象在堆中的地址,多个变量可以指向同一个对象。当将一个引用类型的变量作为参数传递给函数时,会将该变量的引用复制一份给形参。形参和实参指向同一个对象,因此对形参的修改会同步到实参。

例如:

public static void main(String[] args) {
    int[] arr = {1, 2, 3};
    changeValue(arr);
    System.out.println(arr[0]); // 输出:10
}

public static void changeValue(int[] array) {
    array[0] = 10;
}

上述代码中,main函数中的arr变量引用一个包含三个元素的数组。当调用changeValue函数时,将arr变量的引用复制一份给形参array。在changeValue函数内部对array[0]的修改也会同步到arr[0],输出结果为10。

需要注意的是,虽然引用传递是传递的引用的副本,但实际上还是传递了对象的引用。因此,当函数内部改变形参的引用时,是不会影响到实参的引用的。只有在通过引用访问对象的内容并修改它时,才会影响到实参。

例如:

public static void main(String[] args) {
    StringBuilder sb1 = new StringBuilder("Hello");
    StringBuilder sb2 = new StringBuilder("World");
    swap(sb1, sb2);
    System.out.println(sb1); // 输出:Hello
    System.out.println(sb2); // 输出:World
}

public static void swap(StringBuilder s1, StringBuilder s2) {
    StringBuilder temp = s1;
    s1 = s2;
    s2 = temp;
}

上述代码中,main函数中分别创建了两个StringBuilder对象:sb1和sb2。当调用swap函数时,将sb1和sb2的引用复制一份给形参s1和s2。在swap函数内部交换了s1和s2的引用,但由于形参只是实参的副本,不会影响到实参的引用。因此在main函数中输出sb1和sb2的值仍然分别是"Hello"和"World"。

综上所述,Java中的函数参数传递方式有值传递和引用传递。对于基本类型来说是值传递,对于引用类型来说是按引用传递的。对于值传递,形参的修改不会影响到实参;而对于引用传递,形参的修改会影响到实参。