调用函数时的参数传递

调用函数时的参数传递

方法调用时,实参将值复制一份传递给形参。形参的改变不会影响实参本身。

值传递机制

int a = 23, b = 89;
add(a, b);

public static int add(int n1, int n2) {
    return n1 + n2;
}Code language: PHP (php)

执行过程:

步骤说明
调用 add(a, b)将 a 的值 23 复制给 n1,将 b 的值 89 复制给 n2
方法内部运算n1 + n2 得到 112 并返回
方法结束后n1、n2 随方法栈帧销毁,a 和 b 的值不变

完整示例代码

package V053;

public class Test {

    public static void main(String[] args) {
        int r = add(1, 2);
        int a = 1, b = 2;
        int r2 = add(a, b);
        a = 100;
        System.out.println(r2);   // 输出 3,不受 a = 100 影响
        int x = 4, y = 5;
        int r3 = add(x, y);
    }

    public static int add(int a, int b) {
        return a + b;
    }
}Code language: PHP (php)

多次调用互不影响

方法每次调用都是独立运行的,不同调用之间不会因为传参导致数据冲突:

int r1 = add(1, 2);   // 第一次调用,形参 a=1, b=2
int r2 = add(3, 4);   // 第二次调用,形参 a=3, b=4,与第一次无关Code language: JavaScript (javascript)

基本类型 vs 引用类型的参数传递

类型传递方式方法内修改是否影响外部
基本类型(int、double 等)值传递(复制值)不影响
引用类型(数组、对象等)地址传递(复制地址)通过引用修改对象属性会影响外部

基本类型示例:

public static void change(int n) {
    n = 100;
}

public static void main(String[] args) {
    int x = 10;
    change(x);
    System.out.println(x); // 输出 10,x 未被改变
}Code language: JavaScript (javascript)

引用类型示例:

public static void changeArr(int[] arr) {
    arr[0] = 999; // 修改的是同一块内存中的数组元素
}

public static void main(String[] args) {
    int[] a = {1, 2, 3};
    changeArr(a);
    System.out.println(a[0]); // 输出 999,外部数组被修改
}Code language: JavaScript (javascript)

注意事项

要点说明
基本类型传参形参是实参的副本,互不影响
引用类型传参形参和实参指向同一对象,修改对象内容会互相影响
重新赋值形参方法内 arr = new int[5]; 只改变形参指向,不影响实参
方法独立性每次调用都有独立的栈帧,数据不共享

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注