类字段作为函数参数

问题描述 投票:-3回答:1

我有一个有一些领域的课:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.