最近做练习时碰到一个问题,Java到底是怎样传参的,经过查资料与实验,我发现Java传参都是传引用变量的副本值。
1 Java中的引用变量
1.1 字面值引用变量:即基本数据类型的引用变量 ,如 int b = 1 , b就是字面值引用变量。
多个字面值引用变量也可以指向同一字面值,其中一个引用修改字面值,不会影响另一个引用字面值。
![](https://images2015.cnblogs.com/blog/742978/201702/742978-20170219213944254-43000894.png)
![](https://images2015.cnblogs.com/blog/742978/201702/742978-20170219214039879-1852591175.png)
1.2 对象引用变量:即普通java对象的引用变量 ,如 String a = "abc" , Object b = new Object,a、b就是对象引用变量。
Java 是不能直接操作对象的,只能通过“对象引用的操作”来操作对象。而对象的引用的表示就是对象变量。可以多个对象引用变量指向同一个对象。
(1)对于普通对象
其中一个引用修改对象值,也会影响另一个引用的对象值。如下图:
![](https://images2015.cnblogs.com/blog/742978/201702/742978-20170219212241269-1754523834.png)
![](https://images2015.cnblogs.com/blog/742978/201702/742978-20170219212641800-2063871554.png)
而如果其中一个引用改变指向的值,另一个引用不改变。如下图:
(2)对于String类或者包装类对象:
String类和包装类如Interger、Character类对象的值,类似于基本数据类型的值,是存放在栈中的,不可改变的。
比如String类的源码,其值value和其本省都是final的,一旦赋值就不可改变。
![](https://images2015.cnblogs.com/blog/742978/201702/742978-20170219214749425-1233930232.png)
故引用并不能修改对象值,如果其中一个引用“修改对象值”,它只是修改其指向的对象,另一个引用不改变。
2 实验验证
class Test { int intInObj; String strInObj; Integer integerInObj; public Test(int intInObj, String strInObj, Integer integerInObj){ this.intInObj = intInObj; this.strInObj = strInObj; this.integerInObj = integerInObj; } } public class SendValue{ public static void main(String[] args) { // 测试1:传int int testInt = 1; SendValue.change(testInt); System.out.println(testInt); // 测试2:传String String testString = "1"; SendValue.change(testString); System.out.println(testString); // 测试3:传Integer Integer testInteger = 1; SendValue.change(testInteger); System.out.println(testInteger); // 测试4:传对象 Test testObject = new Test(1, "1", 1); SendValue.change(testObject); // 形参修改原对象内的值 System.out.println(testObject.intInObj); System.out.println(testObject.strInObj); System.out.println(testObject.integerInObj); // 测试5:传对象 SendValue.changeObject(testObject); // 形参改变指向的对象 System.out.println(testObject.intInObj); System.out.println(testObject.strInObj); System.out.println(testObject.integerInObj); } public static void change(int i) { i = 10; } public static void change(String str) { str = "10"; } public static void change(Integer i) { i = 10; } public static void change(Test test) { test.intInObj = 10; test.strInObj = "10"; test.integerInObj = 10; } public static void changeObject(Test test) { test = new Test(100, "100", 100); } }
获得结果如下:
画图解释测试4和测试5: