在 Java 中,方法的值传递 是指将实参的值传递给方法的形参。Java 中只有 值传递,没有引用传递。具体来说:
-
对于 基本数据类型,传递的是值的副本。
-
对于 引用数据类型,传递的是引用的副本(即地址的副本)。
1. 基本数据类型的值传递
对于基本数据类型(如 int
、double
、char
等),方法传递的是值的副本。修改形参不会影响实参。
例子:
java
Copy
public class Main { public static void main(String[] args) { int a = 10; System.out.println("调用方法前: a = " + a); // 输出 10 changeValue(a); // 传递 a 的值(10)的副本 System.out.println("调用方法后: a = " + a); // 输出 10(a 的值未改变) } public static void changeValue(int b) { b = 20; // 修改形参 b 的值 System.out.println("方法内: b = " + b); // 输出 20 } }
-
输出结果:
Copy
调用方法前: a = 10 方法内: b = 20 调用方法后: a = 10
-
解释:
-
a
的值是10
,调用changeValue(a)
时,传递的是a
的值的副本(即10
)。 -
在方法内部修改
b
的值不会影响a
的值。
-
2. 引用数据类型的值传递
对于引用数据类型(如数组、对象等),方法传递的是引用的副本(即地址的副本)。修改形参的引用不会影响实参的引用,但修改形参指向的对象内容会影响实参指向的对象内容。
例子:
java
Copy
public class Main { public static void main(String[] args) { int[] arr = {1, 2, 3}; System.out.println("调用方法前: arr[0] = " + arr[0]); // 输出 1 changeArray(arr); // 传递 arr 的引用的副本 System.out.println("调用方法后: arr[0] = " + arr[0]); // 输出 100 } public static void changeArray(int[] brr) { brr[0] = 100; // 修改形参指向的数组内容 System.out.println("方法内: brr[0] = " + brr[0]); // 输出 100 } }
-
输出结果:
Copy
调用方法前: arr[0] = 1 方法内: brr[0] = 100 调用方法后: arr[0] = 100
-
解释:
-
arr
是一个数组引用,调用changeArray(arr)
时,传递的是arr
的引用的副本(即地址的副本)。 -
brr
和arr
指向同一个数组对象,因此修改brr[0]
会影响arr[0]
。
-
3. 值传递的通俗比喻
-
基本数据类型:
-
就像你复印了一份文件(值的副本),修改复印件不会影响原件。
-
例如:
int a = 10;
传递的是10
的副本。
-
-
引用数据类型:
-
就像你复印了一张银行卡(引用的副本),银行卡指向同一个银行账户。
-
例如:
int[] arr = {1, 2, 3};
传递的是数组引用的副本,但数组内容共享。
-
4. 总结
-
Java 中只有值传递:
-
对于基本数据类型,传递的是值的副本。
-
对于引用数据类型,传递的是引用的副本。
-
-
基本数据类型:修改形参不会影响实参。
-
引用数据类型:修改形参的引用不会影响实参的引用,但修改形参指向的对象内容会影响实参指向的对象内容。