Java - 通过 "Reference Value"?检索值还是引用值?

标签 java

如果我有一门像下面这样的类(class):

public class Foo()
{
    private RandomObject randomObject = new RandomObject();

    public RandomObject GetRandromObject()
    {
        return randomObject;
    }
}

在另一个类中我这样做:

public class Goo()
{
    private Foo fooObject = new Foo();

    public Goo()
    {
        RandomObject ro = fooObject.GetRandomObject();

        ro.ChangeNumberVariable(23);
    }
}

请问fooObjectrandomObject NumberVariable改为23?

如果没有,我只需要在 Foo 中有一个方法即可叫SetRandomObject然后传入 ro ?这可以很好地替代 Java 中的引用传递吗?

如果我这样做会怎样:

public class Goo()
{
    private Foo fooObject = new Foo();

    public Goo()
    {
        fooObject.GetRandomObject().ChangeNumberVarialbe(23);
    }
}

还是没有改变NumberVariable吗? ?

最佳答案

在这两种情况下,fooObject.randomObject 都会将 NumberVariable 更改为 23。它们几乎是等效的,只是前者使用了额外的引用。

这不会使 Java 进行引用传递。 Java是按值传递的。每当您将某些内容作为参数传递给方法时,即使您传递的是对象的引用,它也会被复制。

虽然您可以使用复制的引用来访问和改变其末尾的对象,就像您在这里所做的那样,但对该引用的任何重新分配都无法逃脱该方法。

在你的第一个例子中:

ro = new RandomObject();

不会改变 fooObject.randomObject 的任何内容。

关于Java - 通过 "Reference Value"?检索值还是引用值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909458/

相关文章:

java - 如何从Java将级联作业提交到远程YARN群集?

java - 为什么 actionListener 只执行了四次?

Java 8 DateTimeFormatter 拒绝带有偏移量的正确 ISO 8601 日期/时间

java - 为什么Finalize方法的S.O.P没有显示在以下程序的结果中,请解释一下?

java - vs-code tomcat 扩展不刷新静态文件(html、css、js ..)

java - 如何在 hibernate 中重用 Criteria 对象?

java - JFreeChart 中的差距

java - 使用填充密码解密时,非法 block 大小异常输入长度必须是 16 的倍数

java - Calendar.getInstance() 如何知道当前年份?

java - 使用 Java 根据扩展名检索目录的第一个文件