-
缥缈止盈
Java令人困惑,因为一切都是通过值传递的。但是,对于引用类型的参数(即不是原始类型的参数),引用本身是通过值传递的,因此它似乎是按引用传递的(人们常常声称是)。情况并非如此,如下所示:Object o = "Hello";mutate(o)System.out.println(o);private void mutate(Object o) { o = "Goodbye"; } //NOT THE SAME o!将打印Hello到控制台。如果要打印上面的代码,Goodbye可以使用如下所示的显式引用:AtomicReference<Object> ref = new AtomicReference<Object>("Hello");mutate(ref);System.out.println(ref.get()); //Goodbye!private void mutate(AtomicReference<Object> ref) { ref.set("Goodbye"); }
-
繁星淼淼
我可以在Java中通过引用传递参数吗?没有。为什么呢 Java 只有一种将参数传递给方法的模式:按值。注意:对于基元,这很容易理解:您将获得值的副本。对于所有其他引用,您将获得引用的副本,这也称为按值传递。
-
富国沪深
在Java中,在语言级别上没有类似于ref的东西。在Java中,只有按值传递语义为了好奇,您可以在Java中实现类似于ref的语义,只需将对象包装在可变的类中即可:public class Ref<T> { private T value; public Ref(T value) { this.value = value; } public T get() { return value; } public void set(T anotherValue) { value = anotherValue; } @Override public String toString() { return value.toString(); } @Override public boolean equals(Object obj) { return value.equals(obj); } @Override public int hashCode() { return value.hashCode(); }}测试用例:public void changeRef(Ref<String> ref) { ref.set("bbb");}// ...Ref<String> ref = new Ref<String>("aaa");changeRef(ref);System.out.println(ref); // prints "bbb"