【问题标题】:Java argument passing [duplicate]Java参数传递[重复]
【发布时间】:2014-09-15 21:46:41
【问题描述】:

我知道有几篇文章解释了 Java 中的参数传递。我也知道参数是按值传递的,但值是对对象的引用。假设我有以下 2 个方法。

public void append(List<String> list){
    list.add("some string");
}

public void incr(int count){
    count++;
}

如果我调用第一个方法,对象list 会被修改,并且在方法调用之后修改的值也存在。但是当我调用incr(count)时,一旦方法调用返回,count的修改值就会丢失。

为什么在某些情况下,值会被修改,而在其他情况下却没有?

【问题讨论】:

  • list 是一个引用,指的是一个存在于参数列表之外的 List 对象。 count是值,不是引用,它的值只存在于参数列表中。
  • count++ 等价于 count = count + 1。它为count 变量分配一个新值。第一个 sn-p 不会将新列表分配给 list 变量。它只修改列表对象的内容。
  • 例如,您不能通过 list = someOtherList; 更改调用者引用的 List 对象。
  • 尼克:你在做两件不同的事情。 count++ 表示 count = count + 1。您正在重新分配 count。尝试在其他方法中执行相同操作:list = new ArrayList&lt;String&gt;()。该新列表将仅存在于该方法中,原始列表不会被修改。
  • "但是值是对对象的引用如果参数是引用类型(即它引用一个对象)"

标签: java argument-passing


【解决方案1】:

我也知道参数是按值传递的,但值是对对象的引用。

这不是 java 所做的。 Java 是按值传递的。如果某物是引用类型,则该引用是按值传递的。但这与通过 REFERENCE 传递不同。因此,在您的第二个示例中,count 变量是按值传递的,因此您的更改会丢失。

【讨论】:

  • "但这不等于传值。"这就是准确地什么是“按价值传递”。您还说,“Java 是按值传递的”,所以这里真的不清楚您在说什么。
  • 你是完全正确的。打字太快了,我自己也糊涂了。术语已更正。
猜你喜欢
  • 2015-06-28
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 2016-10-16
  • 2012-12-14
相关资源
最近更新 更多