为什么这个Java程序与我的期望相反?

时间:2014-05-19 04:53:15

标签: java

为什么这个程序与我的期望背道而驰?

我期待:1 50 47 50
我得到:0 50 0 50

class Poppet {
    int i;
    Poppet(int i) {
        i = i;
    }
}

class Ideone
{
    private final int i = 50; // Initialized final
    private final int j; // Blank final
    private final Poppet p; // Blank final reference
    // Blank finals MUST be initialized in the constructor:
    public Ideone() {
        j = 1; // Initialize blank final
        p = new Poppet(1); // Initialize blank final reference
        System.out.println(p.i);
    }
    public Ideone(int x) {
        j = x; // Initialize blank final
        p = new Poppet(x); // Initialize blank final reference
        System.out.println(p.i);
    }

    public static void main (String[] args)
    {
        Ideone t = new Ideone();
        System.out.println(t.i);
        Ideone r = new Ideone(47);
        System.out.println(r.i);
    }
}

你能解释一下原因吗?

2 个答案:

答案 0 :(得分:4)

变化:

Poppet(int i) {
   i = i;
}

为:

Poppet(int i) {
    this.i = i;
}

通过执行i = i您将方法参数赋给自己,而您真正想要做的是将其分配给类成员变量。

答案 1 :(得分:2)

局部变量阴影,如JLS 6.4.1中所述。

如果要设置实例变量i,则必须在this.i中添加前缀。

class Poppet {
    int i;
    Poppet(int i) {
       this.i = i;
    }
}