2017-01-03 6 views
-3

Почему переменные, которые я изменяю внутри myMethod, не изменяются за пределами этой области?Является ли Java pass-by-value или pass-by-reference?

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

, вы можете' return; 'в функции void, какие действия действуют как' break' внутри loop – SomeJavaGuy

ответ

1

Каждый раз, когда вы вызываете myMethod(i + 1, j), в стеке создаются новые локальные переменные i и j и инициализируются значениями, переданными им вызывающим.

Когда каждое исполнение myMethod() возвращает, локальные переменные i и j выходят из сферы действия. Вы возвращаетесь к предыдущему исполнению myMethod(), у которого есть свои локальные переменные i и j, имеющие свои значения.

Наконец, когда стек вызовов возвращается к исходному myMethod(0,3) вызова, что исполнение имеет локальные переменные i и j со значениями 0 и 3.

Значения i и j никогда не меняются. Есть только несколько локальных переменных с именем i и j, каждый из которых имеет ограниченный объем.

+0

точно так же, как вы упомянули, но никогда не натыкаетесь на такие вещь. Было бы здорово, если бы упоминал где-то более серьезный пример. Я видел этот фрагмент кода в реализации сортировки слиянием. –

+0

@RoseK, вы просто не знали терминологии для этого, поэтому у вас не было простого способа его поиска. Это обсуждалось в Stack Overflow и во всем Интернете, поэтому теперь у вас есть возможность получить дополнительную информацию, начиная с этого вопроса: http://stackoverflow.com/questions/40480/is-java-pass-by-reference -или-передача по значению/40523 # 40523 – clearlight

0

JLS - Chapter 14. Blocks and Statements содержит ответ на ваш вопрос:

break (§14.15), continue (§14.16), и return (§14.17) заявления вызывают передачу контроля, может препятствовать нормальному завершению заявлений, которые содержат их.

Элемент управления возвращается к заявлению, из которого был вызван метод.

Смежные вопросы