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

Java函数参数的传递方式都有哪些?

发布时间:2023-07-04 15:24:31

在Java中,函数参数的传递方式有值传递和引用传递。

1. 值传递:

值传递是将实际参数的值复制一份给形式参数,函数对形式参数进行操作不会改变实际参数的值。

示例代码如下:

public class ValuePassing {
    public static void main(String[] args) {
        int x = 10;
        System.out.println("Before change: " + x); // 输出:Before change: 10
        changeValue(x);
        System.out.println("After change: " + x); // 输出:After change: 10
    }
    
    public static void changeValue(int value) {
        value = 20;
    }
}

2. 引用传递:

引用传递是将实际参数的引用(地址)复制一份给形式参数,函数对形式参数的修改会改变实际参数的值。

示例代码如下:

public class ReferencePassing {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println("Before change: " + Arrays.toString(arr)); // 输出:Before change: [1, 2, 3]
        changeValue(arr);
        System.out.println("After change: " + Arrays.toString(arr)); // 输出:After change: [4, 5, 6]
    }
    
    public static void changeValue(int[] array) {
        for (int i = 0; i < array.length; i++) {
            array[i] += 3;
        }
    }
}

需要注意的是,Java中的基本类型参数(如int、char等)传递的是值。而对于引用类型参数(如数组、对象等),实际上传递的是地址(引用)。

此外,对于Java中的String类型,为了避免不可变性引起的问题,也可以将其视为值传递。但实际上,String类型在传递过程中的操作只会影响新的String对象的引用,而不会改变原来的String对象。

例如:

public class StringPassing {
    public static void main(String[] args) {
        String str = "Hello";
        System.out.println("Before change: " + str); // 输出:Before change: Hello
        changeValue(str);
        System.out.println("After change: " + str); // 输出:After change: Hello
    }
    
    public static void changeValue(String s) {
        s += " World";
    }
}

从输出结果可以看出,虽然在changeValue方法中对s进行了修改,但是并没有改变str的值。这是因为String类型是不可变的,对其进行修改实际上是创建了一个新的String对象。