为什么这个程序与我的期望背道而驰?
我期待: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);
}
}
你能解释一下原因吗?
答案 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;
}
}