如何在Java中使用引用?

Mah*_*ine 10 java reference pass-by-reference

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

void sum(int& x)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

但在Java和sign中是一个编译器错误!请帮我理解Java中的参考资料.

jos*_*efx 10

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

public void sum(int[] i){
   i[0] = ...;
}
Run Code Online (Sandbox Code Playgroud)

要么

public void sum(MyInt i){
   i.value = ...;
}
public class MyInt{
   public int value; 
}
Run Code Online (Sandbox Code Playgroud)

对于你的例子,类似下面的东西可以工作

public int sum(int v){
   return ...;
}
Run Code Online (Sandbox Code Playgroud)

要么

public int sum(){
   return ...;
}
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

例:

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

void primitive(int i){
  i = 0;
}
Run Code Online (Sandbox Code Playgroud)

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

 void reference(Object ref){
    ref = new Object();//points to new Object() only within this method
 }
Run Code Online (Sandbox Code Playgroud)

修改全局可见的对象

void object(List l){
   l.add(new Object());//modifies the object instead of the reference
}
Run Code Online (Sandbox Code Playgroud)

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

  • "默认情况下,对象通过引用传递" - 这是错误的.一切都是Java中的传值.令人困惑的地方是**引用**(非原始变量)也通过值**传递**.请注意,按值传递引用与通过引用传递对象不同. (3认同)

Jos*_*Fox 7

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

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


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


wha*_*ley 5

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果删除读取 `f = new Foo()` 的行会发生什么?我的猜测是你会打印 99,而不是 0。 (5认同)