2012-02-23 83 views
2

我正在尝试构建android GSM的litle gam。我有很多单位,他们都有目的地。为了计算目的地,我使用了一个名为CalDes的函数。此功能CalDes正在计算我的单位速度。所以我发送了一些变量,我必须再次编辑并使用它们。为此,我必须将这些变量与参考一起发送。这里是一个简单的C++如何在java中做到这一点?在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! 
+0

你是什么意思,没有办法在Java中引用?在Java中,除了本地类型(int,long,byte,boolean,double和float)之外,每个参数都通过引用传递。 – Fred 2012-02-23 11:17:27

+2

哦,男孩。不是另一个java“按值传递/按引用传递”。除了java是传值! – Umair 2012-02-23 11:20:34

+0

关于此主题有大量现有问题,请在发布之前进行搜索。 – DNA 2012-02-23 11:30:35

回答

12

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 
    
+1

谢谢你的很好的解释。 – 2012-02-23 11:56:38

1

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

+1

不完全 - 见http://stackoverflow.com/questions/40480/is-java-pass-by-reference – DNA 2012-02-23 11:22:02

+1

@DNA:嗯,这是 - 很多事情---是一个透视问题。如果我们谈论引用,那么Java就是通过价值传递的。如果我们谈论物体,它是通过参考。 Java的传球方式与大多数其他先发语言不同。您无法决定如何传递值或对象。在Java中传递一个对象是不可能的。而且你不能在Java中通过引用传递一个原始类型。这就是为什么有像java.lang.Integer这样的类型。人。而且你不能将参考传递给参考。这是OP要求的。 – jmg 2012-02-23 11:31:09

+1

@jmg:这里的关键是“传递参考”是一个特定的术语:它意味着将参考*传递给调用上下文中的**变量**到被调用的上下文中,所以被调用的上下文可以修改调用上下文的变量的内容。与对象引用绝对没有任何关系。 Java完全是按价值传递的。 **值被传递,对于对象来说,是一个对象引用,但与通过引用没有任何关系。 – 2012-02-23 11:34:11