首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java传值问题?

Java传值问题?
EN

Stack Overflow用户
提问于 2009-12-17 16:43:41
回答 9查看 1.5K关注 0票数 4

我们知道Java只支持“按值传递”.If,例如,我将一个集合传递给一个函数,那么函数内部对这个集合的修改不应该在这个function.But之外更新这不是在Java?.How中的情况,我们得出这个结论吗?

请任何人用一个证据来结束这次讨论。

EN

回答 9

Stack Overflow用户

发布于 2009-12-17 16:49:13

通过值将对象传递给方法意味着为该方法提供了对象引用的副本,但仍然可以从传递的引用副本中访问对象成员。在集合的情况下,这包括调用添加和删除对象的方法,当然还包括修改包含的对象本身。

票数 8
EN

Stack Overflow用户

发布于 2009-12-17 17:12:52

你混淆了“值”的含义。如果您正在处理对象,这意味着对引用的值所做的任何更改都不会反映到外部。演示此行为的一个简单示例如下所示:

代码语言:javascript
复制
public void foo() {
  String s = "example";
  String param = s;
  bar(param);
  assert s == param : "The value of parameter reference was not modified";
  assert param.equals("example");
}

public void bar(String param) {
  param = "something different";
}

但是,通过值传递并不意味着您不能更改对象的内部状态。这是完全可能的,并对外界产生了影响:

代码语言:javascript
复制
public void foo() {
  List<String> l = Arrays.asList("example");
  List<String> param = l;
  bar(param);
  assert s == param : "The value of parameter reference was not modified";
  assert !param.get(0).equals("example") : "bar changed the internal state of the parameter";
  assert !l.get(0).equals("example") : "bar changed the internal state of the list that is reference equal to the parameter";
}

public void bar(List<String> param) {
  param.set(0, "something different");
}

当然,对象内部状态的这种更改会一直反映在调用方堆栈中,这可能会导致不可预见的副作用。这就是引入immutable object pattern的原因。在Java标准库中,java.lang.Objectjava.lang.String是实现此模式的类的示例。但是,Java不提供可以声明类实现此模式的语言特性,因此必须依赖类的JavaDoc和/或源代码来确保对象是不可变的。

票数 4
EN

Stack Overflow用户

发布于 2009-12-17 16:55:23

如果您想要对象的“按值传递”行为,您可以将对象的clone传递给该方法,因此即使该方法更改了传递的对象,原始对象也保持不变。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1920287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档