2017-01-03 136 views
-3

爲什麼我在myMethod裏修改的變量沒有在該範圍之外修改?Java是通過值傳遞還是通過引用傳遞?

public class TestLoop { 

    public static void main(String[] args) { 
     myMethod(0, 3); 

    } 

    static void myMethod(int i, int j) { 
     System.out.println("i for:" + i + " j:" + j); 
     if (i == j) 
      return; 
     else { 

      myMethod(i + 1, j); 
      System.out.println("after myMethod Call for: i:" + i + " j: " + j); 
     } 
     System.out.println("outside i for: " + i); 
    } 
} 
+3

你是什麼意思「回滾」?這些變量在方法中不存在,它們在返回後又怎麼樣?如果你的意思是對方法的調用不會改變方法以外的變量,那麼就是這樣。它與'return'無關,變量只是不改變外部。 '0'或'3'如何改變? –

+0

只是一個遞歸調用,當局部變量滿足條件'i == j'時,終止,讀取關於局部變量和返回語句 –

+0

您可以'返回;'在一個void函數中,這種行爲類似於循環 – SomeJavaGuy

回答

1

每當您撥打myMethod(i + 1, j)時,都會在堆棧上創建新的本地變量ij,並初始化爲調用者傳遞給它們的值。

當每次執行myMethod()時,局部變量ij超出範圍。您將返回到之前的myMethod()執行,該執行有其自己的本地變量ij有自己的值。

最後,當調用堆棧返回到原來的myMethod(0,3)調用,執行已局部變量ij與價值03

ij的值永不改變。只有多個局部變量名爲ij,每個變量的範圍有限。

+0

完全相同,正如你所提到的,但從來沒有偶然發生過事情。如果提到某處更嚴重的示例,會很好。我在合併排序實現中看到了這段代碼。 –

+0

@RoseK,你只是不知道這個術語,所以你沒有一個簡單的方法來搜索它。這已經在堆棧溢出和遍及互聯網上討論過了,所以現在你有辦法獲得更多的信息,從這個問題開始:http://stackoverflow.com/questions/40480/is-java-pass-by-reference -or通按值/ 40523#40523 – clearlight

0

JLS - Chapter 14. Blocks and Statements包含您的問題的答案:

break(§14.15),continue(§14.16),並return(§14.17)語句將導致控制轉移是可能會阻止正常完成包含它們的語句。

該控件返回到調用方法的語句。