【问题标题】:Is Java pass-by-value or pass-by-reference? [closed]Java 是按值传递还是按引用传递? [关闭]
【发布时间】:2017-05-17 05:44:05
【问题描述】:

为什么我在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);
    }
}

【问题讨论】:

  • “回滚”是什么意思?变量不存在于方法中的其他任何地方,返回后它们怎么可能是任何东西?如果您的意思是对方法的调用不会更改方法外部的变量,那么就是这样。它与return 无关,变量只是不会在外部改变。 0 或 3 将如何变化?
  • 只是一个递归调用,当局部变量满足条件i==j时终止,阅读局部变量和返回语句
  • 您可以在 void 函数中使用 return;,这类似于循环内的 break
  • 您的代码似乎假设调用myMethod 可以更改其变量的值。它不能。 Java 严格按值传递。请参阅stackoverflow.com/questions/40480/… 如果您想从您调用的方法中返回一个值,那么您需要返回该值。

标签: java


【解决方案1】:

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

当myMethod() 的每次执行返回时,局部变量i 和j 就会超出范围。您返回到之前的 myMethod() 执行,它有自己的局部变量 i 和 j 有自己的值。

最后,当调用堆栈返回到最初的myMethod(0,3) 调用时,该执行具有局部变量i 和j,其值为0 和3。

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

【讨论】:

  • 与您提到的完全相同,但从未偶然发现此类事情。如果参考更严重的例子会很棒。我在合并排序实现中看到了这段代码。
  • @RoseK,你只是不知道那个术语,所以你没有一个简单的方法来搜索它。这已经在 Stack Overflow 和整个 Internet 上进行了讨论,所以现在您可以通过以下问题获取更多信息:stackoverflow.com/questions/40480/…
【解决方案2】:

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

break(第 14.15 节)、continue(第 14.16 节)和 return(第 14.17 节)语句会导致控制权转移,这可能会阻止包含以下内容的语句的正常完成他们。

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

【讨论】:

    猜你喜欢
    • 2016-11-28
    相关资源
    最近更新 更多