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

5种常见的 Java 函数参数传递方式

发布时间:2023-06-04 06:42:14

在 Java 中,函数参数传递的方式有五种:传值调用、传引用调用、传值-引用调用、传指针调用和传数组调用。每种方式有其特定的用途和优缺点。本文将分别介绍这五种方式的概念、特点以及在实际开发中的应用。

传值调用

传值调用(Call by Value)是指函数在调用时,将实参的值复制一份传递给形参,函数内部对形参的修改不会影响实参。这种方式适用于处理简单数据类型。在传值调用中,函数的实参值不会被修改。

例如,下面的代码演示了传值调用的基本用法:

public class CallByValueExample {

    public static void main(String[] args) {

        int x = 1;

        int y = 2;

        swap(x, y);

        System.out.println("x=" + x + ", y=" + y);

    }

    public static void swap(int a, int b) {

        int temp = a;

        a = b;

        b = temp;

    }

}

输出结果为:x=1, y=2。由于传值调用是将实参的值复制一份传递给形参,所以在函数内部对形参的修改不会影响实参,因此 swap 函数对 x 和 y 的值并没有产生影响。

传引用调用

传引用调用(Call by Reference)是指函数在调用时,将实参的地址传递给形参,函数内部通过指针访问实参的值。这种方式适用于处理复杂数据类型或需要修改实参值的情况。在传引用调用中,函数的实参值会被修改。

例如,下面的代码演示了传引用调用的基本用法:

public class CallByReferenceExample {

    public static void main(String[] args) {

        int[] arr = new int[]{1, 2, 3};

        increment(arr);

        System.out.println(Arrays.toString(arr));

    }

    public static void increment(int[] array) {

        for (int i = 0; i < array.length; i++) {

            array[i]++;

        }

    }

}

输出结果为:[2, 3, 4]。由于传引用调用是将实参的地址传递给形参,所以在函数内部通过指针访问实参的值,可以对实参的值进行修改。

传值-引用调用

传值-引用调用(Call by Value-Reference)是指函数在调用时,将实参的值和地址都传递给形参,函数内部通过指针访问实参的值。这种方式适用于处理复杂数据类型或需要修改实参值的情况。在传值-引用调用中,函数的实参值也会被修改。

例如,下面的代码演示了传值-引用调用的基本用法:

public class CallByValueReferenceExample {

    public static void main(String[] args) {

        Person p = new Person("Tom", 18);

        changeName(p);

        System.out.println(p.getName());

    }

    public static void changeName(Person person) {

        person.setName("Jerry");

    }

}

class Person {

    private String name;

    private int age;

    public Person(String name, int age) {

        this.name = name;

        this.age = age;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

}

输出结果为:Jerry。由于传值-引用调用是将实参的值和地址都传递给形参,所以在函数内部通过指针访问实参的值,可以对实参的值进行修改。

传指针调用

传指针调用(Call by Pointer)是指函数在调用时,将指向实参地址的指针传递给形参,函数内部通过指针访问实参的值。这种方式和传引用调用类似,都是通过指针访问实参的值,但是在 Java 中,没有指针的概念,因此不适用于 Java。

传数组调用

传数组调用(Call by Array)是指函数在调用时,将数组名(即数组的地址)传递给形参,函数内部通过指针访问数组元素的值。这种方式和传引用调用类似,都是通过指针访问实参的值,但是传数组调用只适用于数组类型。

例如,下面的代码演示了传数组调用的基本用法:

public class CallByArrayExample {

    public static void main(String[] args) {

        int[] arr = new int[]{1, 2, 3};

        increment(arr);

        System.out.println(Arrays.toString(arr));

    }

    public static void increment(int[] array) {

        for (int i = 0; i < array.length; i++) {

            array[i]++;

        }

    }

}

输出结果为:[2, 3, 4]。由于传数组调用是将数组名(即数组的地址)传递给形参,函数内部通过指针访问数组元素的值,可以对数组元素进行修改。

结论

在 Java 中,函数参数传递的方式有五种:传值调用、传引用调用、传值-引用调用、传指针调用和传数组调用。在实际开发中,需要根据实际情况选择合适的方式,以实现对实参的修改或者避免对实参的修改。