我可以在Java中通过引用传递参数吗?

我想要与C#ref关键字类似的语义。



幕布斯7119047
浏览 499回答 3
3回答

缥缈止盈

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> {&nbsp; &nbsp; private T value;&nbsp; &nbsp; public Ref(T value) {&nbsp; &nbsp; &nbsp; &nbsp; this.value = value;&nbsp; &nbsp; }&nbsp; &nbsp; public T get() {&nbsp; &nbsp; &nbsp; &nbsp; return value;&nbsp; &nbsp; }&nbsp; &nbsp; public void set(T anotherValue) {&nbsp; &nbsp; &nbsp; &nbsp; value = anotherValue;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public String toString() {&nbsp; &nbsp; &nbsp; &nbsp; return value.toString();&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public boolean equals(Object obj) {&nbsp; &nbsp; &nbsp; &nbsp; return value.equals(obj);&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public int hashCode() {&nbsp; &nbsp; &nbsp; &nbsp; return value.hashCode();&nbsp; &nbsp; }}测试用例:public void changeRef(Ref<String> ref) {&nbsp; &nbsp; ref.set("bbb");}// ...Ref<String> ref = new Ref<String>("aaa");changeRef(ref);System.out.println(ref); // prints "bbb"
打开App,查看更多内容
随时随地看视频慕课网APP