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

Java函数的形参传递——值传递与引用传递

发布时间:2023-07-01 18:24:38

在Java中,函数的形参传递方式可以分为值传递和引用传递两种。

值传递是指将实参的值复制给形参,即在函数调用过程中,对形参的任何修改都不会影响实参的值。在值传递的情况下,函数内部对形参的操作不会影响到外部的变量。

引用传递是指将实参的引用(内存地址)复制给形参,形参和实参指向同一块内存地址。在引用传递的情况下,函数内部对形参的修改会影响到外部的变量。

在Java中,对于基本数据类型(如int、float、boolean等),函数的形参传递方式是值传递。这是因为基本数据类型的变量存储的是值本身,而不是内存地址。当我们将一个基本数据类型的变量作为实参传递给函数时,函数会创建一个新的变量,将实参的值复制给这个变量,并在函数结束后销毁这个变量。因此,在函数中对形参的修改不会影响到外部的变量。

例如:

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

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

在这个例子中,尽管在函数changeValue中修改了形参b的值为20,但是在main函数中输出的变量a仍然是10,说明对形参b的修改不会影响外部的变量a。

而对于引用数据类型(如数组、对象等),函数的形参传递方式是引用传递。这是因为引用数据类型的变量存储的是内存地址,当我们将一个引用数据类型的变量作为实参传递给函数时,函数会创建一个新的指针,指向实参所指向的内存地址。因此,在函数中对形参的修改会影响到外部的变量。

例如:

public static void main(String[] args) {
    int[] arr = {1, 2, 3};
    changeArray(arr);
    System.out.println(Arrays.toString(arr));  // 输出[4, 5, 6]
}

public static void changeArray(int[] array) {
    for (int i = 0; i < array.length; i++) {
        array[i] += 3;
    }
}

在这个例子中,函数changeArray中通过遍历数组,将每个元素加3,此时修改了形参array的值,使得外部的变量arr也发生了变化。

需要注意的是,在Java中,虽然对象属于引用数据类型,但是当我们将一个对象作为实参传递给函数时,实际上是将对象的地址值(即引用)复制给了形参。因此,在函数中修改对象属性的值会对外部的对象产生影响,但是我们无法通过修改形参来改变实参的引用。

最后,需要强调的是在Java中的形参传递中不存在传地址这种说法,因为Java中的形参和实参是完全独立的两个变量,通过值传递或引用传递来进行参数的传递。