web-dev-qa-db-ja.com

Javaで参照を使用する方法は?

Javaで参照を使用したいのですが、方法がわかりません!たとえば、C++では次のように記述します。

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

しかし、Java&signはコンパイラエラーです!Javaでの参照を理解するのを手伝ってください。

10
Mahdi_Nine

オブジェクトはデフォルトで参照によって渡されます オブジェクトは参照によりアクセスですが、プリミティブ値(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はどちらも、オブジェクトの変更に基づいています。

10
josefx

通常のJavaパラメータはすでにC++の値渡しやポインタよりもC++参照に近いので、すべてのJavaメソッドすでにこんな感じです。

intおよびその他のプリミティブはJavaでは特別です。上記はオブジェクト参照に当てはまります。


編集:より正確には、@ fatihで述べたように、すべてのJava呼び出しは値渡しです。ただし、オブジェクトを渡すときは、値による参照を渡します。したがって、最初の近似として、上記のステートメントは正しいです。通常のJavaパラメーターは、C++の値渡しまたはポインター渡しよりもC++参照に似ています。

7
Joshua Fox

JavaのPassBy 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;
    }
}
4
whaley

ApacheCommonsの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では、この方法で返される値は1つだけです。

0
rghome