java - 最终引用对象被修改

标签 java android arraylist final

我为这个而疯狂。

我想做的是从一个ArrayList中获取一个对象,修改后添加到另外3个中。

问题是当我修改其他对象时,我从 ArrayList 获得的对象也被修改了...无法弄清楚为什么,这是正常的吗?

代码如下:

final Product tmpRef = productsRef.get(i);
Product tmp = tmpRef;
tmp.setPos(products1.size());
Log.d("test2","tmpRef:"+tmpRef.getPos()+";tmp:"+tmp.getPos());

Product tmp2 = tmpRef;
tmp2.setPos(products2.size());
                Log.d("test2","tmpRef:"+tmpRef.getPos()+";tmp:"+tmp.getPos()+";tmp2:"+tmp2.getPos());

Product tmp3 = tmpRef;
tmp3.setPos(products3.size());
                Log.d("test2","tmpRef:"+tmpRef.getPos()+";tmp:"+tmp.getPos()+";tmp2:"+tmp2.getPos()+";tmp3:"+tmp3.getPos());
tmp.setPos(products1.size());

“pos”只是一个简单的 int,带有 getter/setter。

LogCat 输出:

03-21 09:56:14.926: D/test2(6200): tmpRef:9;tmp:9
03-21 09:56:14.926: D/test2(6200): tmpRef:7;tmp:7;tmp2:7
03-21 09:56:14.926: D/test2(6200): tmpRef:0;tmp:0;tmp2:0;tmp3:0

在@FD_、@blackbelt 和@Guidobaldo da Montefelt 的解释下,我结束了创建一个简单的新 Porduct 的构造函数,以便能够复制对象,而不仅仅是引用。谢谢大家。

最佳答案

本质上,您只是将引用存储在您的 ArrayList 中,因此您是否使用类似 Product tmp = tmpRef; 的东西并不重要。 tmp 仍然指向同一个对象,因此更改将应用​​于两者。

在这种情况下,final 仅表示指针一旦设置就无法更改。

只需搜索深拷贝 java 以获得可能的解决方案。

关于java - 最终引用对象被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22554417/

相关文章:

java - 未使用 TextButton 调用 Libgdx InputListener "exit()"

android - 横向启动 Android 模拟器

java - 对于每个循环问题

java - 如何将这三个订单列表合并到一个列表中,同名项目合并到一行?

java - 将 arraylist 发送到数组以检查难题是否可解决

java - JAXB 解码,同一对象 - 多个实例

java - 将 ArrayList 字符串值转换为字节数组

Java 线程 : Unexpected behavior when providing timeout argument in lock. wait()

java - 与示例 Android Activity 建立解析连接。错误:Execution failed for task ':app:dexDebug'

android - 让两个应用程序使用相同的签名相互通信