首选明确什么是值传递,什么是引用传递。
1、值传递:
值传递是对于基本类型变量而言的,传递的是该变量的一个副本,改变副本不改变原变量;
2、引用传递:
传递的是该对象地址的一个副本,对引用对象进行操作会同时改变原对象本身;
class TreeNode(){
int val;
TreeNode left;
TreeNode right;
TreeNode(int val){
this.val=val;
}
}
public class Test{
public static void test(int paramA,TreeNode paramRoot){
paramA=2;
paramRoot.val=2;
}
public static void main(String[]args){
int a=1
TreeNode root=new TreeNode(1);
test(a,root);
}
}
如以上代码,这里我们可能会以为root传到test里面的paramRoot是引用传递,但实际上仍然是值传递,参数paramRoot在此处只是传递了root这个引用变量的一个副本,并不是传递对象地址。
如下图,root这个引用变量传递给paramRoot变量后,paramRoot变量也就指向了TreeNode对象,root和paramRoot都是对TreeNode对象的引用变量而已,此时该变paramRoot.val,时会对TreeNode对象产生改变的。
如果你仍然觉得root传到test方法里面是引用传递的话,那么看下面代码
public class Test{
public static void test(int paramA,TreeNode paramRoot){
paramA=2;
paramRoot=new TreeNode(3);
}
public static void main(String[]args){
int a=1
TreeNode root=new TreeNode(1);
test(a,root);
}
}
如果是引用传递,那么对象地址直接传给了paramRoot,对paramRoot重新new一个的话,main方法里面的TreeNode对线是会被直接改变为新的TreeNode对象的,但在java中实际上并不会,如下图,new一个新的TreeNode之后,只是把paramRoot这个引用变量指向了一个新的TreeNode对象而已,并不会改变到原始的TreeNode对象。
tip:以上内容穿插部分自己的理解,如果有误请指教。