起因
有几次a->b时,想在a内把数据p传到b内,在b内修改p后,a内也同步生效;但是很少能成功,成功的也是在某种情况下。那么具体什么情况才能生效,研究一下。
值传递和引用传递
值传递(pass by value),指的是方法传参时,传递的是实际参数的副本,这时候如果在方法中对参数进行修改,不会影响到实际参数;
引用传递(pass by reference),在方法传参时,将实际参数传到方法中,在方法中对参数进行修改,会影响到实际参数
基础类型,引用类型
- 基础类型
java中8大基础类型:
- 整数型:byte、short、int、long
- 浮点型:float、double
- 字符类型:char
- 布尔类型:boolean
- 引用类型
除基础类型之外的数据类型
- 类、接口
- 数组
- 字符串
- 包装类(Double、Integer...)
- 基础类型初始化时,变量的内容在栈内;引用类型初始化时,数据内容在堆上,引用初始化在栈内,并且引用的值是数据内容的内存地址
栗子
测试的代码
public class Test3 {
public static void main(String[] args) {
int init = 2; // 没有被改变
String str = "init"; // 没有被改变
UpdateSelf updateSelf = new UpdateSelf(); // 被改变
testParamPass(init, str, updateSelf);
System.out.println(init);
System.out.println(str);
System.out.println(updateSelf.upInt);
}
public static int testParamPass(int param, String str, UpdateSelf updateSelf) {
param = 100;
str = "update";
updateSelf.setUpInt(99);
return param;
}
public static class UpdateSelf {
int upInt = 3;
public void setUpInt(int upInt) {
this.upInt = upInt;
}
}
}
结论
java中,形参不论是基础类型还是引用类型,在方法内的改动都不会影响到实际参数的数据;只有把本身带有改变对象方法的参数传进来,才会改变实际参数。