java - 将参数传递给Java中的方法

标签 java parameter-passing

我对一件微不足道的事情感到困惑 - 将参数传递给方法并更改它们的值......我最好给你一些代码:

public class Test {
  public static void main(String[] args) {
    Integer val = new Integer(41);
    upd(val);
    System.out.println(val);

    Man man = new Man();
    updMan(man);
    System.out.println(man.name);
  }

  static void upd(Integer val) {
    val = new Integer(42);
  }

  static void updMan(Man man) {
    man.name = "Name";
  }

  static class Man {
    String name;
  }
}

您能解释一下为什么我传递的 Integer 对象没有更新而 Man 对象更新了吗? Integer 和 Man 对象不是通过引用传递的(由于它们的非原始性质)吗?

最佳答案

因为对于 Integer,您正在创建一个新对象。对于 Man,您只需更改其值之一,对象 man 保持不变。

考虑以下几点:

static void updMan(Man man) {
  man = new Man();
  man.name = "Another Man";
}

这也不会改变您最初的 man

--编辑

您可以通过以下方式“模拟”Integer 的可变性:

static void upd(Integer val) {
    try {
        Field declaredField = val.getClass().getDeclaredField("value");
        declaredField.setAccessible(true);
        declaredField.set(val, 42);
    } catch (Exception e) {
    }
}

关于java - 将参数传递给Java中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10946523/

相关文章:

java - 使用 Java 在类路径中添加 .jar 文件

java - Spring + JPA @OneToMany 与 orphanRemoval

javascript - 如何在调用不带括号的函数时传递参数[Javascript]

java - 在 Java 方法中传递和使用 Class

java - 如何检查时间是否在指定范围内?

java - 将 Jenkins CI 部署到 Heroku

java - 进行选择时,ListView 列表会反转

unit-testing - 创建一个 `std::env::Args` 迭代器用于测试

ios - 将数据从 iOS 标签字段发送到网站文本字段

c++ - C++ 编译器实际上如何在引用参数中传递文字常量?