在 Java 中,所有参数都是按值传递的,包括引用类型。这意味着传递给该方法的是引用的实际值,而不是引用本身。这可能会令人困惑,因为看起来引用是按引用传递的,因为对参数引用的对象所做的任何更改都将反映在原始对象中。
但是,这不是真正的按引用传递行为。以下示例演示了这一点:
Object o = "Hello"; mutate(o); System.out.println(o); private void mutate(Object o) { o = "Goodbye"; } //NOT THE SAME o!
执行此代码后,输出将为“Hello”。这是因为 mutate 方法接收原始对象引用的副本,而不是原始对象本身。当执行 o = "Goodbye" 行时,它改变了 mutate 方法内部的引用变量 o,但不影响方法外部的原始 o 变量。
要实现真正的按引用传递行为,一种选择是使用显式引用,如下所示:
AtomicReference<Object> ref = new AtomicReference<>("Hello"); mutate(ref); System.out.println(ref.get()); //Goodbye! private void mutate(AtomicReference<Object> ref) { ref.set("Goodbye"); }
在这种情况下,AtomicReference 包装器保存对原始对象的引用。当 mutate 方法接收到 ref 参数时,它可以直接访问原始对象,并且对该对象所做的任何更改都会反映在方法外的原始对象中。
以上是Java 是按值传递还是按引用传递?的详细内容。更多信息请关注PHP中文网其他相关文章!