总述
java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。也就是说,方法中的是“原参数的复印件,不是原件”,所以在方法中的改变不会影响原值。
基本数据类型参数的传值
对于基本数据类型,传递的是值的副本,副本改变不会影响原件
引用类型参数的传值
对于引用类型参数的传值,传递的是值得副本,但引用类型指的是“对象的地址”,因此,副本和参数都指向了同一个“地址”,改变“副本指向地址对象的值,也就意味着原件指向地址对象的值也发生了改变”。
示例测试
代码
/**
* 测试参数传递的方式
* @author dxt
*
*/
public class TestParamTransport {
int id;
public TestParamTransport(){
}
/**
* 构造函数,初始化id
*/
public TestParamTransport(int id){
this.id = id;
}
/**
* 将t的id改为999
* @param t
*/
public void changeId(TestParamTransport t){
t.id = 999;
}
/**
* 将整型n赋值为888
* @param n
*/
public void changNum(int n){
n = 888;
System.out.println("n = " + n);
}
public static void main(String[] args){
//初始化一个id为001的对象 t
TestParamTransport t = new TestParamTransport(001);
//将对象作为参数,更改id
t.changeId(t);
System.out.println("t.id = " + t.id);
//以int型为参数(值传递),看是否可以将id改为888
t.changNum(t.id);
System.out.println("t.id = " + t.id);
}
}
结果
分析
第一行输出的t.id = 999,对应的是main()函数中的第一个输出,即在创建对象t时,将id初始化为了001,但将对象t作为参数传递到changeId()函数中,也就是原件t指向的地址是addr1,而副本t也指向了地址addr1,然后对所指向的地址中的内容进行修改,所以原件指向的地址中的内容也就发生了改变,id变为了999。(如果对副本t的指向进行修改,比如副本t = new TestParamTransport(),那么副本t指向了addr2,而原件不会发生改变)
第二行输出的n = 888,对应的是changeNum()函数中的输出,即将t.id的副本传到了changeNum()函数中,也就是n = t.id,然后在函数中n发生了改变,由999变为了888。因为只是副本n改变,原件不变,所以t.id仍为999。
总结
写方法时要注意是基本数据类型参数的传值还是引用数据类型的传值。