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

Java函数参数的传递方式比较

发布时间:2023-07-06 06:19:32

Java中函数参数的传递方式主要有两种:值传递和引用传递。

值传递(Pass by Value)是指在函数调用时,将实际参数的值复制给形式参数,即在函数内部修改形式参数的值不会影响到实际参数的值。

在Java中,基本数据类型(如int、float、boolean等)都是通过值传递来传递参数的。例如:

public class PassByValueExample {
    public static void main(String[] args) {
        int num = 10;
        changeValue(num);
        System.out.println("Num after function call: " + num);
    }
    
    public static void changeValue(int num) {
        num = 20;
    }
}

输出结果为:“Num after function call: 10”,说明在changeValue函数中修改了形式参数num的值,并没有影响到实际参数num的值。

引用传递(Pass by Reference)是指在函数调用时,将实际参数的地址传递给形式参数。通过引用传递,可以在函数内部修改实际参数的值。

在Java中,对象(包括数组)是通过引用传递来传递参数的。例如:

public class PassByReferenceExample {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        changeValue(arr);
        System.out.println("Array after function call: " + Arrays.toString(arr));
    }
    
    public static void changeValue(int[] arr) {
        arr[0] = 10;
    }
}

输出结果为:“Array after function call: [10, 2, 3]”,说明在changeValue函数中修改了实际参数arr的值,修改结果被保留了下来。

需要注意的是,Java中的引用传递只是将一个变量的地址传递给函数,函数中修改的是实际参数指向的对象的值,而不是修改实际参数本身所指向的地址。所以,如果在函数内部重新为形式参数赋值,它只会影响形式参数的指向,而不会影响实际参数。

例如:

public class PassByReferenceExample2 {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("Hello");
        changeValue(str);
        System.out.println("String after function call: " + str);
    }
    
    public static void changeValue(StringBuilder str) {
        str = new StringBuilder("World");
    }
}

输出结果为:“String after function call: Hello”,说明在changeValue函数中重新为形式参数str赋值,并没有影响实际参数str所指向的对象。

总结来说,Java中的函数参数传递方式有值传递和引用传递两种。基本数据类型通过值传递来传递参数,对象通过引用传递来传递参数,引用传递只是将变量的地址传递给函数,函数中修改的是实际参数指向的对象的值。如果在函数内部重新为形式参数赋值,不会影响实际参数。