java副本_Java传参都是传引用变量的副本

最近做练习时碰到一个问题,Java到底是怎样传参的,经过查资料与实验,我发现Java传参都是传引用变量的副本值。

1 Java中的引用变量

1.1 字面值引用变量:即基本数据类型的引用变量 ,如 int b = 1 , b就是字面值引用变量。

多个字面值引用变量也可以指向同一字面值,其中一个引用修改字面值,不会影响另一个引用字面值。

6ea7eaf878e525b8dc949ba3d4b6c29b.png 

a033160be6282e6d30a693787b4c778c.png

1.2 对象引用变量:即普通java对象的引用变量 ,如 String a = "abc" , Object b = new Object,a、b就是对象引用变量。

Java 是不能直接操作对象的,只能通过“对象引用的操作”来操作对象。而对象的引用的表示就是对象变量。可以多个对象引用变量指向同一个对象。

(1)对于普通对象

其中一个引用修改对象值,也会影响另一个引用的对象值。如下图:

1fb98b51ab952f4afc04407b6d0de5aa.png 

eb3e9eab58ba1d078ffad301bfa5f3eb.png

而如果其中一个引用改变指向的值,另一个引用不改变。如下图:

a2da2cf0a16892868c838709a65bf9ba.png

(2)对于String类或者包装类对象:

String类和包装类如Interger、Character类对象的值,类似于基本数据类型的值,是存放在栈中的,不可改变的。

比如String类的源码,其值value和其本省都是final的,一旦赋值就不可改变。

a5cccf88c0208a7a5cf154cd4270d2e4.png

故引用并不能修改对象值,如果其中一个引用“修改对象值”,它只是修改其指向的对象,另一个引用不改变。

987a0fee34c862a956902f48620587b4.png

19ffdc6789c36cd6d8779976d24e0c8d.png

2 实验验证

classTest {intintInObj;

String strInObj;

Integer integerInObj;public Test(intintInObj, String strInObj, Integer integerInObj){this.intInObj =intInObj;this.strInObj =strInObj;this.integerInObj =integerInObj;

}

}public classSendValue{public static voidmain(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(inti) {

i= 10;

}public static voidchange(String str) {

str= "10";

}public static voidchange(Integer i) {

i= 10;

}public static voidchange(Test test) {

test.intInObj= 10;

test.strInObj= "10";

test.integerInObj= 10;

}public static voidchangeObject(Test test) {

test= new Test(100, "100", 100);

}

}

获得结果如下:

3d2cedbf589be00679ea72f95a7fcba5.png

画图解释测试4和测试5:

765ba928de88eb1425f2915265257330.png

dfe1717ac0e7389022aa602fd8cc0162.png

2ffd2fd97ee524beba0bcd015a03d9e5.png

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值