Answers:
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中,在语言级别上没有类似于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"
AtomicReference(对于非原始)?或AtomicSomething(例如:)AtomicBoolean用于基本体?
                    int代替Integer,bool代替Boolean等等足够重要吗?也就是说,包装类(如果担心语法会自动解包)不起作用?
                    摘自James Gosling的“ Java编程语言”:
“ ...在Java中,只有一种参数传递模式-按值传递-使事情变得简单。。。”
The pronouncement of the language god should be declared the answer:不是。尽管Java的创建者有什么想法或相信,但绝对的答案将来自语言规范的引文。
                    我认为你不能。最好的选择是将要通过“通过引用”传递的东西封装到另一个类实例上,并(外部)传递类的引用(按值)。如果你明白我的意思...
也就是说,您的方法更改了它传递的对象的内部状态,然后调用者可以看到该状态。
另一种选择是使用一个数组,例如,
 void method(SomeClass[] v) { v[0] = ...; }
但是1)必须在调用方法之前初始化该数组; 2)仍然不能以这种方式实现例如swap方法...这种方式在JDK中使用,例如在中java.util.concurrent.atomic.AtomicMarkableReference.get(boolean[])。