java 方法内部变量重新创建对象:外部的变量未重新赋值 ->可变对象与引用传递

代码复现:

List<IntentDetail> intentDetail = intention.getIntentDetail();

1.intentDetail 参数指向 直接创建的对象

   
    intentDetail = new ArrayList<>();
    IntentDetail intentDetail1 = new IntentDetail(1, null, "xx", "xx", "xx", "xx", 0.0, null, null, false);
    intentDetail.add(intentDetail1);
    xxx  xx = new xxx("xxx", "=", "xxx", null, null, false);
    IntentDetail intentDetail2 = new IntentDetail(1, null, "xx", "xx", "xx", "xx", 0.0, xx, null, false);
    intentDetail.add(intentDetail2);
    intention.setIntentDetail(intentDetail);

2.集成进方法

     xxxxIntentDetailChange(xxx, intentDetail){
     intentDetail = new ArrayList<>();
    IntentDetail intentDetail1 = new IntentDetail(1, null, "xx", "xx", "xx", "xx", 0.0, null, null, false);
    intentDetail.add(intentDetail1);
    }

问题:
发现intentDetail 参数指向 直接创建的对象 没问题,但是集成进方法,参数的数据没有被改写。
后面使用解决问题

intentDetail.clear();

原因:

原理
可变对象与引用传递:在Java中,对象是通过引用来传递的,这意味着当你将一个对象传递给一个方法时,你实际上传递的是这个对象在内存中的地址。因此,如果你在方法内部修改了对象的属性,这些修改在方法外部是可见的。

Java 中所有的对象(如 ArrayList、自定义类实例等)都是通过**引用(reference)**来操作的。
当你把一个对象传入方法时,并不是复制整个对象,而是复制这个对象的引用(即内存地址)。
因此,方法内部和外部的变量都指向同一个对象实例。
重新分配引用:当你在方法内部重新分配了局部变量intentDetail(如intentDetail = new ArrayList<>();),这并不会影响方法外部对这个对象的引用。你只是改变了局部变量所指向的内存地址,而原始引用仍然指向原来的对象。

这两句话合在一起的理解是:
1.对象参数是引用类型的
2. 方法内部变量和 外部的变量,不是同一个,他们只是指向了同一个引用地址。
3.如果方法内部的参数变量 新创建了对象,那这个参数指向的是新的引用地址。并没有改变引用地址的数据。从根本上其实是改变赛道了,没有操作原来的对象。
4.想要解决这个问题,还是要操作原来的对象,上面的代码实际是想要对原来的对象重新操作,那我直接清空然后再赋值就好了,具体的业务需要具体分析。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_Octopus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值