请原谅我,我正在努力理解这个概念,不想在不知道发生了什么的情况下接受它。 我读到只有类X的对象可以修改自己,从下面的代码,Class 事实上,ModifyX可以通过调用setNum方法来更改X.x.num。
我的问题是:
为什么[ModifyX
object" mx"]能够更改[X
对象" x" ]价值超出X
?
作为参数传递的y的值在X中更改,但为什么在main(String[] args)
中没有更改?
public class X {
private int num;
public void setNum(int num) {
this.num = num;
}
public void getNum() {
System.out.println("X is " + num);
}
public static void main(String[] arsgs) {
int y = 10;
X x = new X();
x.setNum(y); //sets the value of num in X to y;
x.getNum(); // print the value of num in X
ModifyX mx = new ModifyX(); // A new class that is inteded to modify X
mx.changeX(x); //calls the set method of X with new Value 5
x.getNum(); // returns the new Value passed in changeX instead of y
System.out.println("Integer Y is not changed = " + y); // but y still remains the same
}
}
class ModifyX {
public void changeX(X num) {
num.setNum(5); // changes y to 5
}
}
答案 0 :(得分:2)
此方法
GetSavesPerTask
获取值s.setNum(y);
的副本并将其传递给方法。 Java总是按值传递,因此它总是传递值的浅表副本。这意味着您可以更改此值的副本而不影响另一个。
此方法
y
与
相同num.setNum(5);
所以这里改变了一个值num.num = 5;
的{{1}}字段。
您的本地变量num
是X num
,并且此变量在任何地方都不会更改,因此没有理由相信它应该更改。
答案 1 :(得分:0)
所以'num'是X类的非公共成员,因此只有类本身才能直接修改它。但是,类X还提供了“公共”访问器函数“setNum”,这是一种方法,任何使用该类的人都可以使用它来“间接”设置属性'num'的值。