簡體   English   中英

如何在Java中使用引用?

[英]How to use references in Java?

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

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

但在Java和sign中是一個編譯器錯誤! 請幫我理解Java中的參考資料。

默認情況下通過引用傳遞對象通過引用 訪問對象,但是無法創建對原始值(byte,short,int,long)的引用。 您必須創建一個對象來包裝整數或使用單個元素數組。

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都基於對象的修改。

普通的Java參數已經更接近於C ++引用而不是C ++傳值或傳遞指針。 所以,你所有的Java方法都是這樣的。

但是,int和其他原語在Java中是特殊的; 以上內容適用於對象引用。


編輯:更准確地說,如@fatih所述,所有Java調用都是按值傳遞的。 但是,當您傳遞一個對象時,您將按值傳遞引用。 因此,作為第一個近似值,上述語句是正確的:普通Java參數更類似於C ++引用而不是C ++傳值或傳遞指針。

理解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;
    }
}

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只允許以這種方式返回一個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM