类字段作为函数参数

时间:2018-04-03 13:44:31

标签: 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 {
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,如果我将它作为函数参数传递,则不要修改。

而且,最重要的是,我不明白为什么会发生这种情况,因为我在函数中传递它,但在该函数中我不使用该对象本身。

1 个答案:

答案 0 :(得分:0)

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类型的新对象。这似乎只是一个错误,它发生在我们最好的人身上。