2014-10-09 51 views
-1

我是編程的超級新手,我正在學習測試,並且不理解一段代碼的輸出。我希望你能幫助我理解爲什麼最後打印4?Java,無法可視化輸出

我把代碼扔在Java可視化器的網站上,並且我明白除了爲什麼這一行之外的所有東西...... System.out.println(myScope.z);會打印數字4?

任何幫助,非常感謝!

public class ScopeTest { 
    int z; 

public static void main(String[] args){ 

    ScopeTest myScope = new ScopeTest(); 
    int z = 6; 
    System.out.println(z); 
    myScope.doStuff(); 
    System.out.println(z); 
    System.out.println(myScope.z); 
} 

void doStuff() { 
    int z = 5; 
    doStuff2(); 
    System.out.println(z); 
} 

void doStuff2() { 
    z=4; 
} 
} 

回答

1

步執行代碼一次一個行是一個很好的鍛鍊弄清楚它在做什麼。你應該用紙和鉛筆以及調試器來做到這一點。所以讓我們按照執行順序逐行執行一行代碼。在每行代碼之後,我會解釋它的功能。

ScopeTest myScope = new ScopeTest(); 

創建名爲myScope本地參考變量並將其初始化到對象。

int z = 6; 

創建一個名爲z本地int變量並初始化爲6

System.out.println(z); 

打印本地變量的值z

myScope.doStuff(); 

撥打doStuff()myScope對象。

int z = 5; 

doStuff()創建一個局部變量z並將其初始化5

doStuff2(); 

呼叫doStuff2()

z=4; 

設置名爲z爲值4成員字段。然後將控制返回到doStuff()

System.out.println(z); 

打印出局部變量z的值。然後將控制返回到main()

System.out.println(z); 

打印出局部變量z的值。 (請記住,我們又回到了main()現在。

System.out.println(myScope.z); 

最後,打印出成員字段z(記住它的值設置回doStuff2(),該值被記住,因爲這z是一個成員變量。)

+0

你們是真棒臨屋!很多,你真的幫助過! – NoobCoderChick 2014-10-09 05:23:32

2
  1. ScopeTest myScope = new ScopeTest();初始化myScope.z到(缺省值)
  2. myScope.doStuff();myScope.z到並調用doStuff2()
  3. doStuff2()myScope.z到。

最終的結果是4,關鍵的一點是,在maindoStuff()方法聲明的局部變量z任何有關於ScopeTest聲明的z成員變量無關。

0

您正在main()方法中調用dostuff(),您已初始化z = 5,它是其局部變量z而不是類變量z。所以你打電話dostuff2()其中你是實際上修改類變量z = 4。這就是它在last syestem.out.println(z)中打印z = 4的原因。希望這會幫助你理解輸出。

0

因爲在您的代碼z在第一行中聲明,是實例成員(this上下文)。

所以當過doStuff2()被稱爲this.z設置爲4

//effectively void doStuff2() { this.z=4; }

變量int z方法main內聲明和doStuff()local context

這裏,只有當zthis上下文的值最後被設置(其在doStuff2()內)時纔是重要的。 因此,

System.out.println(z); >> prints value of local variable z declared in main System.out.println(myScope.z); >> prints the value of instance (of ScopeTest which is myscope here) member z

1

這是流量:

myScope.doStuff() - > 1,Z = 5 2. doStuff2() - > Z = 4