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

Java函数的调用方式以及参数传递详解

发布时间:2023-07-02 14:02:34

Java的函数调用方式可以分为两种:传值调用和引用调用。

1. 传值调用:在传值调用中,函数的实际参数的值被复制给函数的形式参数。这意味着在函数内部改变形式参数的值不会影响实际参数的值。

例如:

public static void main(String[] args) {
    int num = 10;
    changeValue(num);
    System.out.println(num);    // 输出结果为10
}

public static void changeValue(int value) {
    value = 20;
}

在上面的例子中,函数changeValue的形式参数value被赋值为10,之后将其修改为20。但是在主函数main中,变量num的值仍然是10,因为在函数调用过程中,实际参数的值被复制给形式参数。

2. 引用调用:在引用调用中,函数的实际参数的地址被复制给函数的形式参数,这意味着在函数内部改变形式参数的值会影响实际参数的值。

例如:

public static void main(String[] args) {
    int[] array = {1, 2, 3};
    changeArray(array);
    System.out.println(array[0]);    // 输出结果为10
}

public static void changeArray(int[] arr) {
    arr[0] = 10;
}

在上面的例子中,函数changeArray的形式参数arr被赋值为数组array的地址,之后将数组的 个元素修改为10。在主函数main中,打印数组的 个元素时,结果为10,因为在函数调用过程中,实际参数的地址被复制给形式参数,所以对形式参数的修改会影响到实际参数。

此外,在Java中还有一种特殊的参数传递方式,即引用传递和基本数据类型的传递。

3. 引用传递:在引用传递中,函数的实际参数和形式参数都指向同一个对象,所以对形式参数的修改会影响到实际参数。

例如:

public static void main(String[] args) {
    StringBuilder sb = new StringBuilder("Hello");
    changeStringBuilder(sb);
    System.out.println(sb.toString());    // 输出结果为"Hello World"
}

public static void changeStringBuilder(StringBuilder str) {
    str.append(" World");
}

在上面的例子中,函数changeStringBuilder的形式参数str和实际参数sb都指向同一个StringBuilder对象,所以在函数内部对形式参数str的修改会影响到实际参数sb。

4. 基本数据类型的传递:对于基本数据类型的参数传递,默认是传值调用,而不是引用传递。这是因为基本数据类型的值存储在栈中,函数的形式参数和实际参数是两个不同的变量,修改形式参数的值不会影响到实际参数。

总结:Java中的函数调用方式有传值调用和引用调用。传值调用中,函数的实际参数的值被复制给函数的形式参数;引用调用中,函数的实际参数的地址被复制给函数的形式参数。在引用传递中,函数的实际参数和形式参数都指向同一个对象,所以对形式参数的修改会影响到实际参数。在基本数据类型的传递中,默认是传值调用,而不是引用传递。