Java参数到底是值传递还是引用传递呢?
先来公布一下答案把
对于基本类型参数来说:是copy值进行传递
对于对象来说:是引用传递
修改了基本类型的参数,原值不变
修改了对象内部的值,则原对象的也会改变
若修改了对象的地址,则原对象不变
一个方法明白这一切
@Test public void test2(){ Integer i = 0; int j = 129; List<Integer> list = new ArrayList<>(); List<Integer> list2 = new ArrayList<>(); System.out.println("实参i = " + i); System.out.println("实参j = " + j); System.out.println("实参list = " + list); System.out.println("实参list2 = " + list2); test3(i++, j, list, list2); System.out.println("传值调用后i = " + i); System.out.println("传值调用后j = " + j); System.out.println("传值调用后list = " + list); System.out.println("传值调用后list2 = " + list2); }
其中 test3 的代码如下:
private void test3(Integer i,int j, List<Integer> list, List<Integer> list2){ System.out.println("test3方法入参i = " + i); System.out.println("test3方法入参j = " + j); System.out.println("test3方法入参list = " + list); System.out.println("test3方法入参list2 = " + list2); i = 130; j = 10; list.add(110); list2 = list; System.out.println("test3给i赋值后 = " + i); System.out.println("test3给j赋值后 = " + j); System.out.println("test3改变list对象中的值后 = " + list); System.out.println("test3给list2重新赋值,也就是改变地址后 = " + list2); }
运行结果:
实参i = 0 实参j = 129 实参list = [] 实参list2 = [] test3方法入参i = 0 test3方法入参j = 129 test3方法入参list = [] test3方法入参list2 = [] test3给i赋值后 = 130 test3给j赋值后 = 10 test3改变list对象中的值后 = [110] test3给list2重新赋值,也就是改变地址后 = [110] 传值调用后i = 1 传值调用后j = 129 传值调用后list = [110] 传值调用后list2 = []
是不是很明显了呀~~~
这里面有一个特例,就是就是包装类型的传递
比如上述代码中的 Integer 类型的传递
为什么与我最一开始说的不一样呢?Integer应该是属于对象,但为什么改变它的参数的值后,原参数并没有变呢?
是这样子的
我们可以看一下 Integer 的源码
可以在我哒断点的这两个地方打断点看一下
由于value值是final类型的,final类型的值是不可以修改的
每次给它赋值都相当于是新new了一个对象,将对象的地址赋值给这个参数
所以,就和我们最开始说的 若修改了对象的地址,则原对象不变 是一样的~~~
一篇文章了解Java参数传递,再也不用纠结到底是值传递还是引用传递
原文:https://www.cnblogs.com/zhangqian27/p/11793209.html