当前位置: 首页 > 面试题库 >

如何在Java中模拟按引用传递?

皇甫雨华
2023-03-14
问题内容

我是一个完整的Java新手。我知道Java将所有参数都视为按值传递,并且还有其他几个线程可以解释这一点。

例如,在C ++中,我可以执行以下操作:

void makeAThree(int &n)
{
   n = 3;
}
int main()
{
   int myInt = 4;
   makeAThree(myInt);
   cout << myInt;
}

哪个将输出3。我知道在Java中,所有参数都是按值传递的,因此您无法操纵传入的参数。在Java中,有没有一种标准的方法来 模拟
按引用传递?有没有办法调用操作传入变量的函数?对于我来说,很难绕开没有办法做到这一点的想法。


问题答案:

模拟传递引用的主要方法是传递包含值的容器。

static void makeAThree(Reference<Integer> ref)
{
   ref.set(3);
}

public static void main(String[] args)
{
  Reference<Integer> myInt = new Reference<>(4);
  makeAThree(myInt);
  System.out.println(myInt.get());
}

由于在Java中,它 引用
到由值(对象本身是从来没有在全部通过)传递的对象,设置ref3makeAThree变化相同的对象则提到myIntmain()

免责声明:Reference这不是您可以直接使用现成的Java的类。我在这里将其用作其他任何对象类型的占位符。这是一个非常简单的实现:

public class Reference<T> {
    private T referent;

    public Reference(T initialValue) {
       referent = initialValue;
    }

    public void set(T newVal) {
       referent = newVal;
    }

    public T get() {
       return referent;
    }
}

编辑

这并不是说修改方法的参数是一个好习惯。通常,这将被视为副作用。通常,最佳做法是将方法的输出限制为返回值和this(如果该方法是实例方法)。修改参数是设计方法的一种非常“
C”的方式,并且不能很好地映射到面向对象的编程。



 类似资料:
  • 问题内容: 我想运行一个Java程序,并使其模拟键盘按键。因此,例如,可以在聚焦的输入框中键入一些文本。这可能吗? 问题答案: 可能会有所帮助。 这是的一个简单示例代码片段:

  • 问题内容: 我读了许多文章,都说Java是通过价值传递的。但是我仍然不能解释按值传递和引用之间的区别。我写了一个示例程序,它像这样执行。 执行 谁能向我解释这些问题… 价值传递是什么意思? 答:它只是将存储在变量中的数字或值传递给函数。我是对还是错。 How do you say Java是通过价值传递? 为什么Java是按值传递而不是按引用传递? 上面的程序Tries是否显示了“按值传递”和“引

  • 问题内容: 此Java代码: 将输出以下内容: 在C ++中,我可以将toyNumber变量作为引用传递,以避免产生阴影,即创建如下相同变量的副本: C ++输出将是这样的: 问题答案: 你有几种选择。最有意义的选择实际上取决于你要执行的操作。 选择1:将toyNumber设为类中的公共成员变量 然后将对MyToy的引用传递给你的方法。 选择2:返回值而不是通过引用传递 此选择将需要对main中的

  • 我有一个scala类a,其中有一个方法。 还有一个B类

  • 问题内容: 我想模拟python中的按值传递行为。换句话说,我想绝对确保我编写的函数不会修改用户提供的数据。 一种可能的方法是使用深层复制: 有没有更有效或更 Python的 方法来实现此目标,对传递的对象进行尽可能少的假设(例如.clone()方法) 编辑 我知道技术上python中的所有内容都是按值传递的。我对 模拟 行为很感兴趣,即确保我不会弄乱传递给函数的数据。我猜最一般的方法是使用其自身

  • 问题内容: 我想从Java方法返回对Scala对象的引用。我怎样才能做到这一点? 我的Scala对象是这样的: …并且我希望我的Java方法像这样: 有没有办法做到这一点? 问题答案: 应该管用。 编辑:之所以可行,是因为这是Scala表示单例对象的方式。该类中有一个名为的字段,其中填充有该类的单个有效实例。但是还有一个叫做的类,它将所有方法复制为静态方法。这样一来,您就可以在大多数情况下像Jav