为什么java中的等式两边都发生了变化?

为什么java中的等式两边都发生了变化?,java,machine-learning,weka,Java,Machine Learning,Weka,我有一个奇怪的问题,把我完全弄糊涂了 我正在为我的项目使用WEKA,我想更改数据集的类值以测试一些东西;因此,我将数据集保存到另一个名为d的值中,并使用setClassValue方法更改类值。最后,我在d和dataset变量中打印每个实例的类值 Instances d=dataset; for (int i = 0; i <dataset.size(); i++) { dataset.get(i).setClassValue(10); System.out.println(

我有一个奇怪的问题,把我完全弄糊涂了

我正在为我的项目使用WEKA,我想更改数据集的类值以测试一些东西;因此,我将数据集保存到另一个名为d的值中,并使用setClassValue方法更改类值。最后,我在d和dataset变量中打印每个实例的类值

Instances d=dataset;
for (int i = 0; i <dataset.size(); i++) {
    dataset.get(i).setClassValue(10);
    System.out.println(dataset.get(i).classValue()+ "\t" +d.get(i).classValue() );
}
实例d=dataset;
对于(int i=0;i
现在有两个变量都引用相同的对象

不像C++,java从不隐式复制任何东西。 如果您想要一个对象的单独副本,您需要自己制作一个


如果对象实现了
Cloneable
,则可以使用
clone()

克隆来实现。克隆并不能保证深度复制。克隆然后使用.setXX方法很可能会同时更改原始和克隆的值。Java中的Cloneable非常糟糕(我的建议是:编写一个复制构造函数,并确保它真正复制了所有内容(如果底层对象也不容易复制,您在这里也会遇到问题)。Java复制变量-只是变量是引用,而不是对象本身。@Xabster Yes,默认值
.clone()
可能返回一个浅拷贝,但可以修改它。它返回一个深拷贝。使用标准拷贝构造函数也可能返回一个浅拷贝…请阅读SLaks答案中的注释。我还建议阅读并参考vs。
d=dataset