我有一个有一些领域的课:
public class ClassA {
private MyType myField;
...
public ClassA() { MyType myField = new MyType(14);}
public MyType get () {
return myField;
}
public void set(double value){
myField.set(value);
}
}
这是MyType类:
public class MyType {
private double zzz;
public MyType (double zzz) {this.zzz=zzz;}
public void set (double zzz) {this.zzz=zzz;}
public double get () {return zzz}
}
然后我又上了一堂课:
public ClassB {
public ClassB(MyType ccc) {
myFunc(ccc);
}
private void myFunc (MyType ccc) {
ccc.set(ccc.get()+9);
}
在另一个类的函数中我有这个:
...
public void anotherFunc(ClassA myObject){
ClassB ddd = new ClassB(myObject.get());
}
...
现在,如果我调用anotherFunc,则myObject.myField.zzz的值变为23(14 + 9)。我希望myObject.myField.zzz为14,如果我将它作为函数参数传递,则不要被修改。
而且,最重要的是,我不明白为什么会发生这种情况,因为我在函数中传递它,但在该函数中我不使用该对象本身。
TL; DR:ccc.set(ccc.get()+9)
与ccc.zzz = ccc.zzz + 9
相同,因为ccc.set()将传递给它的任何内容设置到ccc.zzz上,而ccc是对象myObject.bbb。
好的,你有更新的代码我看到了问题。在你的class ClassB
中,你将你的呼叫集设置在cc上,这是不需要的。
private void myFunc (MyType ccc) {
ccc.set(ccc.get()+9); //this line makes your object ccc change values after adding 9 You should not be doing this if you want ccc to not change.
}
您的代码的先前版本更好,并且正确地将cc.zzz和9的总和设置为MyType类型的新对象。这似乎只是一个错误,它发生在我们最好的人身上。