由于下面的snipet,我得到了“1 0 1”,但我不知道为什么,因此我期待“1 1 1”。请有人向我解释事情是如何发生的
public class Qcb90 {
int a;
int b;
public void f() {
a = 0;
b = 0;
int[] c = { 0 };
g(b, c);
System.out.println(a + " " + b + " " + c[0] + " ");
}
public void g(int b, int[] c) {
a = 1;
b = 1;
c[0] = 1;
}
public static void main(String[] args) {
Qcb90 obj = new Qcb90();
obj.f();
}
}
答案 0 :(得分:6)
更改
b = 1;
到
this.b = 1;
现在的方式是,您正在更改参数(本地)变量而不是类成员变量。
答案 1 :(得分:0)
这是因为int
不是引用对象,例如它不是由单词new
创建的对象,所以当你将b传递给方法时,在方法内部,将为此创建变量,它可以在此方法中有效。如果是由单词new
创建的对象,那么如果它被任何其他方法更改,它将会受到影响。
答案 2 :(得分:0)
函数b
中名为g(int b, int[] c)
的参数隐藏类成员变量b
,因此您要将名为b
的本地参数设置为g(int b, int[] c)
中的1。这根本不会影响成员变量,并且在g
退出后会丢弃新值。
但是,本地参数c
是指针的副本到f
中分配的内存,因此您可以修改内容内存,因为这两个副本都是指针(作为参数传递给g
的副本以及f
中的原始副本)指向同一块内存。
答案 3 :(得分:0)
public class Qcb90 {
int a;
int b;
public void f() {
a = 0;
b = 0;
int[] c = { 0 };
g(b, c);
// so here b is your instance variable
System.out.println(a + " " + b + " " + c[0] + " ");
}
public void g(int b, int[] c) {
a = 1;
//b = 1; this b is a parameter of your method
this.b=1; //now run your program
c[0] = 1;
}
public static void main(String[] args) {
Qcb90 obj = new Qcb90();
obj.f();
}
}
如果您想打印b
值,则需要在this.b
内写g()