关于java函数传参的问题:
两种参数方式:
1.非对象
2.对象
对于第一种传参,就直接传一个值的拷贝即可
低于第二种传参,就是传对象的地址的副本拷贝即可
看一个例子:
class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class Test {
public static void changeStr(TreeNode node) {
node.left = null;
node.right = null;
}
public static void doSth(String str) {
str = null;
}
public static void main(String[] args) {
String s = "test";
System.out.println(s);
doSth(s);
System.out.println(s);
TreeNode node1 = new TreeNode(2, null, null);
TreeNode node2 = new TreeNode(3, null, null);
TreeNode node = new TreeNode(1, node1, node2);
System.out.println(node + " " + node.left + " " + node.right);
changeStr(node);
System.out.println(node + " " + node.left + " " + node.right);
}
}
输出:
test
test
TreeNode@1b6d3586 TreeNode@4554617c TreeNode@74a14482
TreeNode@1b6d3586 null null
结论:
changeStr() 和 doSth()方法 本别是尝试着改变传递的对象地址副本和对象地址副本所对应的对象本身。
从输出结果的前两行来看,其实将传递进去的对象地址副本值置为null,并不会改变原对象。
从输出结果的后两行来看,对对象地址副本所对应的对象本身进行修改是生效了。
所以在副本传递的java传参方式中,改变传进去的地址是没用的,但是改变地址所对应的对象是有用的。