Java值传递机制
1、基本数据类型
public class ValueTransferTest {
public static void main(String[] args) {
int m = 10;
int n = 20;
System.out.println("交换前:");
System.out.println("m = " + m + ", n = " + n);
ValueTransferTest test = new ValueTransferTest();
test.swap(m, n);
System.out.println("交换后:");
System.out.println("m = " + m + ", n = " + n);
}
public void swap(int m, int n) {
int temp = m;
m = n;
n = temp;
}
}
结果
交换前:
m = 10, n = 20
交换后:
m = 10, n = 20
原因
- 如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值
- 就是说,当在main方法里把实参传递给swap方法后,在swap方法里是交换了m,n的值,但是main方法里的m,n并没有变,因为没有改变main方法中变量存储的数据值
2、引用数据类型
package com.gzl;
public class ValueTransferTest {
public static void main(String[] args) {
Data data = new Data();
data.m = 10;
data.n = 20;
System.out.println("交换前:");
System.out.println("m = " + data.m + ", n = " + data.n);
ValueTransferTest test = new ValueTransferTest();
test.swap(data);
System.out.println("交换后:");
System.out.println("m = " + data.m + ", n = " + data.n);
}
public void swap(Data data) {
int temp = data.m;
data.m = data.n;
data.n = temp;
}
}
class Data {
int m;
int n;
}
结果
交换前:
m = 10, n = 20
交换后:
m = 20, n = 10
原因
- data变量存储的是Data对象的引用(地址),而m和n保存在对象内,无论是实参data还是形参data,都是指向同一个对象,因此修改的也是同一个对象。
总结
- 如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值
- 如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值