3 回答
TA贡献2041条经验 获得超4个赞
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"); }
TA贡献1775条经验 获得超11个赞
我可以在Java中通过引用传递参数吗?
没有。
为什么呢 Java 只有一种将参数传递给方法的模式:按值。
注意:
对于基元,这很容易理解:您将获得值的副本。
对于所有其他引用,您将获得引用的副本,这也称为按值传递。
TA贡献1790条经验 获得超9个赞
在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"
添加回答
举报