代码复现:
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.想要解决这个问题,还是要操作原来的对象,上面的代码实际是想要对原来的对象重新操作,那我直接清空然后再赋值就好了,具体的业务需要具体分析。

被折叠的 条评论
为什么被折叠?



