为了账号安全,请及时绑定邮箱和手机立即绑定

java:当参数Object A传递到方法B(Object A1)时,A1是否又分配了一块堆内存

java:当参数Object A传递到方法B(Object A1)时,A1是否又分配了一块堆内存

jeck猫 2019-04-25 18:15:12
先看代码class MyObj {     public int b = 99; } class Test{ public static void main(String[] args) {         Test t = new Test();         int a = 99;         MyObj obj1 = new MyObj();         t.test2(obj1);// 这里传递的参数obj就是引用传递         System.out.println(obj1.b);     }             public void test2(MyObj obj) {         obj = new MyObj();  //纠结在这一行         obj.b = 100;         System.out.println(obj.b);     }         }1.我在搜索java值传递和引用传递时,发现了巨大的矛盾,一部分人说全部是值传递,另一部分人说分值传递和引用传递,现在问题纠结在 运行搭配 test2方法的参数obj 是否是拷贝了对象obj1 ,又分配了一块内存地址都指向堆内存obj1对象。2.我希望获得一个工具能够让我查看执行到test2的方法时的内存 ,我尝试jvisualvm并不能看到
查看完整描述

7 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

对于你说的第二点,可以反编译看看字节码。你标注出来“纠结的那一行”改变了test2中参数的引用即在test2中你new了个对象给了obj,这个方法里面操作的都是新new的对象,但是原来main里面obj1还是原来的引用。

方法调用中通过new操作改变了参数的引用,只对当前方法有影响,原来调用者还是原来的对象。

查看完整回答
反对 回复 2019-05-16
?
萧十郎

TA贡献1815条经验 获得超13个赞

Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。java传递参数时,基本类型的是值传递,引用类型是引用传递


查看完整回答
反对 回复 2019-05-16
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

A1是分配了新的一块内存,因为A1本身是一个引用,在new一个对象时,虚拟机在内存中创建了一个空间,由A1来指向这个空间的内存地址,而你在这行上新new一个,代表重新开辟一个内存空间,此时A1的指向的内存地址,变成了新的开辟的内存的空间地址


查看完整回答
反对 回复 2019-05-16
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

java对象传递时只是个引用地址,也就是两个变量指向同一内存。


查看完整回答
反对 回复 2019-05-16
  • 7 回答
  • 0 关注
  • 494 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号