聊一聊Java为什么是值传递
# 什么是形参,什么是实参
形参:即每个方法的参数,如下代码value
就是一个形参
public static int f(int value) {
}
1
2
2
实参:调用方法时传的参数,如下代码就是括号内部就是实参
f(1)
1
# 值传递与引用传递
值传递:说白了形参会将实参的值拷贝一份作为自己的值来使用,自己无论怎么改变都不会影响到实参的值
引用传递:简单来说就是将实参所指向的变量的地址传给形参,这样形参操作的就是实参所指向的变量的值,一旦形参改变那个值,实参看到的值也是有变化的
# 基本类型值传递
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
swap(num1, num2);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a = " + a);
System.out.println("b = " + b);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
输出结果
a = 20
b = 10
num1 = 10
num2 = 20
1
2
3
4
2
3
4
#
# 引用类型值传递
例1
以下代码所示,将引用类型传给形参后发现实参的值被改变了,但这并不是引用类型传递。java
引用类型的值传递的机制是对于基本类型直接拷贝值,而对于引用类型是拷贝引用类型变量的地址,而引用传递是拷贝引用类型所指向的空间的值,
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
System.out.println(arr[0]);
change(arr);
System.out.println(arr[0]);
}
public static void change(int[] array) {
// 将数组的第一个元素变为0
array[0] = 0;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
输出结果
1
0
1
2
2
例2
以下代码可以看到person
引用类型作为实参传入后,对象xiaozhang
和xiaoli
的名字没有被交换,这就说明了java
对引用类型做的也是值传递,传递的引用类型的地址值。
@Data
public class Person {
private String name;
public static void main(String[] args) {
Person xiaoZhang = new Person("小张");
Person xiaoLi = new Person("小李");
swap(xiaoZhang, xiaoLi);
System.out.println("xiaoZhang:" + xiaoZhang.getName());
System.out.println("xiaoLi:" + xiaoLi.getName());
}
public static void swap(Person person1, Person person2) {
Person temp = person1;
person1 = person2;
person2 = temp;
System.out.println("person1:" + person1.getName());
System.out.println("person2:" + person2.getName());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
输出结果
person1:小李
person2:小张
xiaoZhang:小张
xiaoLi:小李
1
2
3
4
2
3
4
帮助我们改善此页面! (opens new window)
上次更新: 2024/08/13, 09:07:12