我在做一些练习集时遇到了这个问题,并且对它的某些部分感到有些困惑。这两个印刷语句的答案是(5,1,5)和(8,6,2)
public class C2 {
private int p= 1;
private static int q= 2;
private int m1(int p) { p= q+1; q= q+3; return q; }
private int m2(int q) { p= q+1; q= q+3; return q; }
public static void main() {
C2 c= new C2();
int x= c.m1(5);
System.out.println(x + ", " + c.p + ", " + q);
q= 2; c.p= 1;
x= c.m2(5);
System.out.println(x + ", " + c.p + ", " + q);
}
}
似乎在第一个print语句的答案中,静态int q被使用并传递给方法并返回5是有意义的,而另一个字段p用于c.p.最后一个q来自哪里我有点困惑?是否与我返回设置等于变量x相同的q?
对于第二个印刷语句答案,我理解8来自哪里,但是,当c.p = 1时,为什么c.p = 6正好在上面?我们在方法调用期间是否覆盖了这个变量,如果我们这样做了,为什么c.p在执行第一个println语句时没有改变,而是保持在1?最后,在这种情况下的q,为什么它不像第一个println语句,似乎q与return语句给出的q相同?对不起,大量的问题!
答案 0 :(得分:1)
Q1:最后一个q来自哪里?
您在方法static int q
中更新的m1()
会增加到5。
Q2:为什么c.p打印6平方米()?和q为2?
您的参数名称是罪魁祸首。 q = q + 3
,p = q + 1
引用参数值而不是静态变量q
。只有局部变量得到更新,静态变量q
保持为2,您在调用m2
之前已经分配了
尝试在方法q
中将参数名称r
的名称更改为m2()
并自行查看。
答案 1 :(得分:0)
在以下时引用p
变量:
private int m2(int q) {
// Note that q now shadowing static variable q of C2
p= q+1; // Same as to call C2.p = q + 1
q= q+3; // Here you addressing m2 input variable and not the static field q
return q;
}
实际上引用了C2类的引用静态变量。因此,它会在调用之前将您重置为1的事实无效:
q = 2; // Actually similar to calling C2.q = 2, instead
c.p= 1; // While pointing static variables you can simply do C2.p
现在它与m1
方法非常相似:
private int m1(int p) {
// Now static p shadowed by method input parameter
p= q+1; // Changing p of method input parameter
q= q+3; // Same as C2.q += 3
return q;
}
现在您可能需要考虑阅读以下材料,以便更好地了解事情如何起作用: