【问题标题】:Pass by reference in java?在java中通过引用传递?
【发布时间】:2012-02-23 11:13:33
【问题描述】:

我正在尝试为 android GSM 构建一个小游戏。我有很多单位,所有单位都有目的地。为了计算目的地,我使用了一个名为 CalDes 的函数。这个函数 CalDes 正在计算我单位的速度。所以我要发送一些变量,我必须再次编辑和使用它们。为此,我必须参考发送这些变量。这是一个简单的 C++ 如何在 java 中做到这一点?

void swap(SomeType& arg1, Sometype& arg2) {
    SomeType temp = arg1;
    arg1 = arg2;
    arg2 = temp;
}
...
SomeType var1 = ...; // value "A"
SomeType var2 = ...; // value "B"
swap(var1, var2); // swaps their values!

【问题讨论】:

  • Java中没有办法引用是什么意思?在 Java 中,每个参数都是通过引用传递的,除了原生类型(int、long、byte、boolean、double 和 float)。
  • 天啊。不是另一个java“按值传递/按引用传递”。另外java是传值!
  • 这个话题有很多问题,发帖前请搜索一下。
  • @DNA:对于这个特定问题,我没有看到很好的副本。很多关于 Java 是否有传递引用的问题,而不是关于你如何做 OP 想要的事情。我看到的最接近is this one,但在这种情况下,OP 的目标使水变得相当混乱。
  • 公平点 - 不过这个可能有用:stackoverflow.com/questions/3624525/…

标签: java android pass-by-reference


【解决方案1】:

Java 根本没有按引用传递。您有两种选择:

  1. 在数组中传递数据:

    void swap(SomeType[] args) {
        SomeType temp = args[0];
        args[0] = args[1];
        args[1] = temp;
    }
    

    ...但是在调用代码中使用它很痛苦:

    SomeType a = ...;
    SomeType b = ...;
    SomeType[] args = new SomeType[] { a, b };
    swap(args);
    a = args[0];
    b = args[1];
    
  2. 创建一个具有公共SomeType 成员的对象,并传入对象引用。

    void swap(SomeTypeContainer c) {
        SomeType temp = c.a;
        c.a = c.b;
        c.b = temp;
    }
    

    这与 #1 非常相似,但从调用代码中使用可能更方便。

    SomeTypeContainer c = new SomeTypeContainer(/* ... something that creates a and b ... */);
    // Use c.a and c.b directly
    swap(c);
    // Use c.a and c.b directly, they're now swapped
    

【讨论】:

  • 感谢您的精彩解释。
【解决方案2】:

【讨论】:

    【解决方案3】:

    在 Java 中,每个对象总是通过引用传递。但是你不能通过引用传递变量。如果你真的需要,你必须再使用一种间接方式。

    【讨论】:

    • @DNA:嗯,这是 --- 就像很多事情一样 --- 一个视角问题。如果我们谈论引用,那么 Java 就是按值传递。如果我们谈论对象,它是通过引用传递的。 Java 的传递方法与大多数其他早期语言不同。您无法决定如何传递值或对象。在 Java 中不可能按值传递对象。而且您不能在 Java 中通过引用传递原始类型。这就是为什么有 java.lang.Integer 等类型的原因。人。而且您不能将引用传递给引用。这就是 OP 所要求的。
    • @jmg:这里的关键是“pass-by-reference”是一个特定的术语:它意味着在调用上下文中传递一个引用变量 进入被调用上下文,因此被调用上下文可以修改调用上下文的变量内容。绝对与对象引用无关。 Java 完全是按值传递的。在对象的情况下,传递的 是对象引用,但这与传递引用无关。
    • 另见javadude.com/articles/passbyvalue.htm - 这比我说得更好 - “对象不是通过引用传递的。正确的说法是对象引用是通过值传递的。这看起来像是分裂的头发,有点远非如此。意义有天壤之别……”
    猜你喜欢
    • 2011-01-31
    • 2012-03-13
    • 2011-05-02
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多