如何在Java中使用引用?

时间:2011-01-17 11:51:11

标签: java reference pass-by-reference

我想在Java中使用引用,但我不知道如何! 例如,在C ++中我们写道:

void sum(int& x)
{
    ...
}

但是在Java& sign是编译错误! 请帮我理解Java中的参考资料。

4 个答案:

答案 0 :(得分:9)

默认情况下通过引用传递对象通过引用访问对象,但是没有办法创建对原始值的引用(byte,short,int,长)。您必须创建一个对象来包装整数或使用单个元素数组。

public void sum(int[] i){
   i[0] = ...;
}

public void sum(MyInt i){
   i.value = ...;
}
public class MyInt{
   public int value; 
}

对于您的示例,以下内容可以起作用

public int sum(int v){
   return ...;
}

public int sum(){
   return ...;
}

<强>更新

对象引用的附加/更好描述:

始终通过引用访问Java对象。与原始类型一样,此引用按值传递(例如复制)。由于程序员可以在java中访问的所有内容都是通过复制它(引用,基元)来传递的,并且无法创建对基本类型的引用,因此对方法参数(引用,基元)的任何修改只会影响其中的本地副本。方法。 可以在方法中修改对象,因为引用的两个副本(本地和其他)仍然指向同一个对象实例。

示例:

修改方法中的基元,这只会影响i的内部副本,而不会影响传递的值。

void primitive(int i){
  i = 0;
}

修改方法中的引用,这只会影响ref的内部副本,而不会影响传递的值。

 void reference(Object ref){
    ref = new Object();//points to new Object() only within this method
 }

修改一个全局可见的对象

void object(List l){
   l.add(new Object());//modifies the object instead of the reference
}

上面的数组和MyInt都基于对象的修改。

答案 1 :(得分:7)

普通的Java参数已经更接近于C ++引用而不是C ++传值或传递指针。所以,你所有的Java方法都是这样的。

然而,

int 和其他原语在Java中是特殊的;以上内容适用于对象引用。


编辑:更准确地说,如@fatih所述,所有Java调用都是按值传递的。但是,当您传递一个对象时,您将按值传递引用。因此,作为第一个近似值,上述语句是正确的:普通Java参数更类似于C ++引用,而不是C ++传值或传递指针。

答案 2 :(得分:3)

理解Java的Pass By Value语义所需的阅读:

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html http://javadude.com/articles/passbyvalue.htm http://javachannel.net/wiki/pmwiki.php/FAQ/PassingVariables(链接到其他几个页面)

从头脑中完全删除Java可以通过引用传递任何内容的概念。我们来看一个例子,不管吗?

public class App
{
    public static void main( String[] args )
    {
        Foo f1 = new Foo();
        doSomethingToFoo(f1);
        System.out.println(f1.bar); //Hey guess what, f1.bar is still 0 because JAVA IS PASS BY VALUE!!!
    }

    static void doSomethingToFoo(Foo f) {
        f = new Foo();
        f.bar = 99;
    }

    static class Foo {
        int bar = 0;
    }
}

答案 3 :(得分:0)

Apache Commons中的MutableInt类可以做您想要的,尽管它并不漂亮。

MutableInt

void sum(MutableInt mx)
{
    int x = mx.getValue();
    x = ...
    mx.setValue(x);
}

...

MutableInt mx = new MutableInt(5);
sum(mx);
int result = mx.getValue();

为其他基本类型和对象提供了附加类。

仅仅为了提供引用而创建附加对象会涉及一些开销,因此该解决方案不是最佳选择,但是在大多数情况下,您应该没事。

通常,总是最好找到一种从方法返回结果的方法。不幸的是,Java只允许以这种方式返回一个值。