【问题标题】:Are Java function parameters always passed-by-value? [duplicate]Java函数参数总是按值传递吗? [复制]
【发布时间】:2009-07-10 17:19:12
【问题描述】:

只是一个关于如何在 Java 中传递参数的简单问题...

... if ((index = stdout.indexOf(pattern)) != -1) { 整洁(标准输出,索引 + 模式。长度()); 返回真; } else if ((index = stderr.indexOf(pattern)) != -1) { 整洁(标准错误,索引 + 模式。长度()); 返回真; ... 私人无效整洁(StringBuffer缓冲区,int i){ logger.info("截断缓冲区:" + buffer); buffer = new StringBuffer(buffer.substring(i)); logger.info("现在缓冲:" + buffer); }

在这种情况下,stdout 和 stderr(在 tidy() 中用作参数)是否会将它们的值更改为 new StringBuffer(buffer.substring(i))?我的假设是它们将作为对象变量(对象指针)总是按值传递?

【问题讨论】:

标签: java parameters


【解决方案1】:

你错误地陈述了这里发生的事情——对象引用是按值传递的(创建了引用的副本),所以当你调用 tidy.当您执行tidy 的第 2 行时,由它们组成的副本会被修改。

Java 中的参数传递让很多人感到困惑。这里是a good explanation

【讨论】:

  • 谢谢!我喜欢你提到这个“按值传递”问题
  • 我不认为这是一个很好的解释......我不明白。
【解决方案2】:

Java 参数总是按值传递,句号。

这是一篇解释这一现象的可爱文章: http://www.javaranch.com/campfire/StoryPassBy.jsp

在您的情况下,它是 pbr 还是 pbv 并不重要,因为您正在将 sb 重新分配给一个新对象(通过调用 buffer = new StringBuffer(...)buffer.subString(...) 不会改变对象本身)。

【讨论】:

    【解决方案3】:

    来自“Java 编程语言”中的 James Gosling:

    “...Java 中只有一种参数传递模式——按值传递——这让事情变得简单。..”

    我认为这是对此的最终权威。

    【讨论】:

      【解决方案4】:

      不,stdout和stderr不会改变,是的,参数是传值的。

      变量“buffer”将被设置为等于stdout,这意味着buffer将首先指向同一个对象。当缓冲区更改为指向新对象时,旧的 stdout 引用仍将指向旧对象。

      【讨论】:

        【解决方案5】:

        你的假设是错误的。为什么?

        因为函数参数总是按值传递

        当你这样做时:

        buffer = new StringBuffer(buffer.substring(i));
        

        您正在为从参数引用复制的本地引用分配一个新的StringBuffer。所以,原始缓冲区没有改变。

        【讨论】:

          猜你喜欢
          • 2012-12-02
          • 2017-02-22
          • 2011-11-21
          • 1970-01-01
          • 2011-12-15
          • 2013-01-21
          • 1970-01-01
          • 1970-01-01
          • 2012-05-22
          相关资源
          最近更新 更多