java计算的意外结果

时间:2016-03-01 16:21:40

标签: java

由于下面的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();
}
}

4 个答案:

答案 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()