调用函数时的参数传递
方法调用时,实参将值复制一份传递给形参。形参的改变不会影响实参本身。
值传递机制
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]; 只改变形参指向,不影响实参 |
| 方法独立性 | 每次调用都有独立的栈帧,数据不共享 |
Previous: return 的作用
Next: 方法之间的调用