Java 类字段作为函数参数

Java 类字段作为函数参数,java,Java,我有一个包含一些字段的类: 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 { p

我有一个包含一些字段的类:

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());
}
...
现在,如果调用另一个func,那么myObject.myField.zzz的值将变为23(14+9)。我希望myObject.myField.zzz为14,如果我将其作为函数参数传递,则不会对其进行修改

最重要的是,我不明白为什么会发生这种情况,因为我在函数中传递它,但在该函数中我不使用对象本身;DR:
ccc.set(ccc.get()+9)
ccc.zzz=ccc.zzz+9
相同,因为ccc.set()设置传递到ccc.zzz的内容,而ccc是对象myObject.bbb

好了,你的代码更新了,我看到问题了。在您的
类B
中,您正在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类型的新对象。这似乎只是一个错误,它发生在我们最好的人身上

长话短说:之所以会发生这种情况,是因为您传递的是一个可变类,而不是将其更改为不可变类或进行深度复制。@Federico klez Culloca抱歉,我在示例中修改了ClassB。现在应该是了correct@dasblinkenlight那么我怎样才能避免它的改变呢?我通过创建一个双变量并将其作为参数传递来解决这个问题,但它不是很“优雅”,我的意思是,我认为有一种更“标准”的方法删除setter,并用重新分配整个对象来替换对它的调用。阅读有关不可变对象的内容以了解更多信息。您如何检查myObject.bbb.zzz的值?谢谢,现在我了解了发生的情况。我仍然有点困惑,但我认为我的理解是正确的。不客气!我很高兴你能解决问题。不要害怕问更多的问题,看看你需要什么帮助。