2017-06-26 25 views
0

我遇到了這個問題做了一些練習集,並且對它的某些部分有些困惑。這個問題的答案是什麼了兩個打印語句是(5,1,5)和(8,6,2)基本的Java方法執行

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用於cp我有點困惑最後一個q來自哪裏?這是否是我回到設置等於變量x?

對於第二個打印語句的答案,我知道8來自哪裏,然而,爲什麼c.p = 6當它被稱爲c.p = 1正好在上面?我們在方法調用過程中是否覆蓋了這個變量,如果我們這樣做了,爲什麼執行第一個println語句時c.p不會改變,而是停留在1?最後,q在這種情況下,爲什麼它不像第一個println語句那樣,q與return語句給出的q是相同的?對不起,有很多問題!

回答

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?
1

Q1:其中最後一個q被來自哪裏?

它是你在該方法更新了static int qm1()它被遞增到5

Q2:爲什麼在平方米c.p印刷6()? q爲2?

您的參數名稱是罪魁禍首。 q = q + 3,p = q + 1引用參數值而不是靜態變量q。只有本地變量被更新,靜態變量q停留在2,您已調用m2

嘗試改變參數名q的名稱r的方法m2(),看看自己之前分配。