如何在Java中使用引用?

如何在Java中使用引用?,java,reference,pass-by-reference,Java,Reference,Pass By Reference,我想在Java中使用引用,但我不知道如何使用! 例如,在C++中,我们写: void sum(int& x) { ... } 但是在Java中&符号是一个编译器错误! 请帮助我理解java中的引用。< P>普通的java参数已经比C++ C++通过值或传递指针更接近C++引用。所以,您所有的Java方法都已经是这样了 然而,int和其他原语在Java中是特殊的;上述情况适用于对象引用 编辑:更准确地说,如@fatih所述,所有Java调用都是按值传递的。但是,当传递对象时,就

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

void sum(int& x)
{
    ...
}
但是在Java中&符号是一个编译器错误!
请帮助我理解java中的引用。

< P>普通的java参数已经比C++ C++通过值或传递指针更接近C++引用。所以,您所有的Java方法都已经是这样了

然而,int和其他原语在Java中是特殊的;上述情况适用于对象引用



编辑:更准确地说,如@fatih所述,所有Java调用都是按值传递的。但是,当传递对象时,就是按值传递引用。因此,作为第一个近似,上述语句是正确的:普通的java参数比C++的值更接近于C++的值或传递指针。(byte,short,int,long)。您要么创建一个对象来包装整数,要么使用一个元素数组

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

对于您的示例,类似于以下内容的内容可能会起作用

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

更新:

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

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

例如:

在方法中修改原语,这只影响i的内部副本,而不影响传递的值

void primitive(int i){
  i = 0;
}
 void reference(Object ref){
    ref = new Object();//points to new Object() only within this method
 }
在方法中修改引用,这只影响ref的内部副本,而不影响传递的值

void primitive(int i){
  i = 0;
}
 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都基于对对象的修改。

理解Java的传递值语义的必读读物:

http://javadude.com/articles/passbyvalue.htm (链接到其他几个页面)

完全消除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;
    }
}

apachecommons中的
MutableInt
类可以做您想要做的事情,尽管它并不漂亮

为其他基元类型以及对象提供了其他类

仅仅为了提供引用而创建一个附加对象会带来一些开销,因此解决方案不是最优的,但在大多数情况下,您应该可以


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

“默认情况下对象是通过引用传递的”-这是错误的。在Java中,一切都是通过值传递的。令人困惑的是引用(非原语变量)也按值传递。请注意,按值传递引用与按引用传递对象不同。@Jesper这不是完全错误,java中的对象总是按引用传递。引用本身按值传递也是正确的。不能直接传递对象。非基元类型的变量是引用-它们是不是对象本身,就像C++一样。当你谈到java时,谈论“传递对象”是不精确的术语。@杰斯珀,你能为我定义“PASS”吗?看来我的英语技能不适合这个任务。“PASS”在这个上下文中意味着在方法调用中使用变量作为参数。但是这一点不在“PASS”这个词中。但是,在java中的变量是引用,而不是直接表示对象,就像C++一样。post@Esko,除了你不应该仅仅为了做一些小的修饰(比如纠正一个打字错误)而编辑帖子。我觉得@skaffman用那种“语气”发表他的评论很令人沮丧还有6个人投票认为这很有帮助。@Tim:事实上,我确实记得我读过几次与你刚才在官方博客和meta上说的完全相反的内容。在我看来,修正拼写和语法是被认可的,因为有时候这会让其他人更容易理解问题本身。@Esko,你是对的,但现在我更倾向于理解问题本身。@Eskoressed.如果删除读取
f=new Foo()
的行,可能会发生重复情况?我猜您将得到99而不是0。
void sum(MutableInt mx)
{
    int x = mx.getValue();
    x = ...
    mx.setValue(x);
}

...

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