[Java]_函数传参的疑惑与思考
问题来源于leetcode上的两道题 Path Sum I && II,分别写了两个dfs。
1 void dfs(TreeNode node , int sum , ArrayList<Integer> curPath) 2 void dfs(TreeNode node , int sum , boolean ifExist)
问题:在1号中我可以在方法中修改curPath,在结束函数调用时,变量修改仍然生效。
在2号问题中,我即使在函数中修改了ifExist,结束函数调用时,变量修改无效。
疑问:Java的参数传递方式?
解决:考虑下面三种情况:
1、
double a = 10; void tripleValue(double x) x = 3 * x; tripleValue(a);
上述代码运行后,a的值保持不变。结论一:方法不能修改一个基础数据类型(数值型和布尔型)的参数
2、
Employee a = new Employee("july"); void changeName(Employee x ) x.name = "alice"; changeName(a);
上述代码运行后,a的name属性被修改为alice。结论二:方法可以改变一个对象参数的属性
3、
Employee a = new Employee("alice"); Employee b = new Employee("bob"); void swap(Employee p1 , Employee p2){ Employee temp = p1; p1 = p2; p2 = temp; } swap(a , b);
上述代码运行后,a仍然为alice,b仍然为bob。结论三:方法不能让对象参数引用一个新的对象
因此:Java的函数传参全为值传递。
在函数参数为基础数据类型时,方法参数得到参数值的拷贝;
当函数参数为对象时,方法参数得到参数地址的拷贝,但也不是对原对象的引用(引用:类似于对变量取别名,除了名字不一样外,其它均是一样的)。