仅作为个人看法
首先声明一下, 在java中函数传参是值传递, 不是引用传递. 要弄清楚这个问题之前要先弄清楚什么是值传递,什么是引用传递.
函数传参有两种方式
值传递 (pass by value): 是指在调用函数时将实际参数复制一份传递到函数中, 这样在函数中如果参数进行修改,将不会影响到实际参数 .
引用传递 (pass by reference): 是指在调用函数时将实际参数的地址直接传递到函数中, 这样在函数如果对参数进行修改, 将影响实际参数
#传递基本类型变量
@Test public void testParam(){ int i = 10; pass(10); System.out.println(i); //10 } public static void pass(int i){ i=i+1; }
这里将 int i = 10
复制一份, 然后将复制后的基本变量传到函数中, 在函数中对基本变量修改, 因为是两个独立的变量, 所以函数中修改值并不会对实际的参数的值造成影响.
带 '
为复制的参数
#传递引用类型变量
@Test public void testParam(){ User user = new User("zs", 1); pass(user); System.out.println(user); } public static void pass(User u){ u.setUsername("张三"); }
这里的new User()
和new User() '
都是引用变量, 虽然两个引用变量的地址不同, 但是引用的同一个堆内存中的User, 所以方法中修改对象, 外部也会变
#那么为什么java传递引用类型就是值传递呢?
请看下一个例子
@Test public void testParam(){ String a="abc"; pass(a); System.out.println(a); } public static void pass(String a){ a = "ABC"; }
加入是引用传递的话传的是一个地址, 那么在函数中修改值的话, 那因该输出的结果是"ABC"
但是呢 结果却是 "abc"