为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯7119047 2019-11-06 10:20:29
我想要与C#的ref关键字类似的语义。
查看完整描述

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"); }


查看完整回答
反对 回复 2019-11-06
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

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


没有。


为什么呢 Java 只有一种将参数传递给方法的模式:按值。


注意:


对于基元,这很容易理解:您将获得值的副本。


对于所有其他引用,您将获得引用的副本,这也称为按值传递。


查看完整回答
反对 回复 2019-11-06
?
富国沪深

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"


查看完整回答
反对 回复 2019-11-06
  • 3 回答
  • 0 关注
  • 498 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信