基本Java方法执行

时间:2017-06-26 20:24:19

标签: java

我在做一些练习集时遇到了这个问题,并且对它的某些部分感到有些困惑。这两个印刷语句的答案是(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相同?对不起,大量的问题!

2 个答案:

答案 0 :(得分:1)

  

Q1:最后一个q来自哪里?

您在方法static int q中更新的m1()会增加到5。

  

Q2:为什么c.p打印6平方米()?和q为2?

您的参数名称是罪魁祸首。 q = q + 3p = 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; 
}

现在您可能需要考虑阅读以下材料,以便更好地了解事情如何起作用:

  1. Understanding Class Members
  2. Shadowed Classes or Variables in Java
  3. What is variable shadowing used for in a Java class?