Java是按值传递还是按引用传递?

时间:2017-01-03 07:18:28

标签: java

为什么我在myMethod内修改的变量不会在该范围之外修改?

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);
    }
}

2 个答案:

答案 0 :(得分:1)

每次调用myMethod(i + 1, j)时,都会在堆栈上创建新的局部变量ij,并将其初始化为调用者传递给它们的值。

myMethod()的每次执行返回时,局部变量ij超出范围。您将返回上一个myMethod()执行,该执行具有自己的局部变量ij具有自己的值。

最后,当调用堆栈返回到原始myMethod(0,3)调用时,该执行具有值为ij的局部变量03

ij的值永远不会改变。只有多个名为ij的局部变量,每个变量的范围都有限。

答案 1 :(得分:0)

JLS - Chapter 14. Blocks and Statements包含您问题的答案:

  

break(§14.15),continue(§14.16)和 return (§14.17)语句导致可能阻止的控制权转移正常完成包含它们的语句。

控件返回到调用方法的语句。