19

のように、Java で引数として配列を渡しても問題ありint[5] &resultませんか?

呼び出し元の関数で配列を変更したいので、配列への参照を渡したいです。構文はどうなりますか?

4

5 に答える 5

40
private void demo() {
    int[] array = new int[5];
    System.out.println(Arrays.toString(array)); // 0, 0, 0, 0, 0
    fillArray(array);
    System.out.println(Arrays.toString(array)); // 0, 1, 2, 3, 4
}

private void fillArray(int[] array) {
    for (int i = 0; i < array.length; i++) {
        array[i] = i;
    }
}

配列は Java のオブジェクトです。また、オブジェクトへの参照は値によって渡されます。

于 2012-12-27T22:31:39.447 に答える
23

Java では、配列は値で渡されますが、値は配列への参照です。配列があるとしますarr。これを渡すと、参照する配列を変更できますが、arr参照する配列を変更することはできませんarr。つまり、メソッド内では、参照されるオブジェクトを変更できますが、同じオブジェクトへの参照である渡された変数を変更することはできません。例を挙げて説明します。

public static void swap(StringBuffer a, StringBuffer b)
{
    StringBuffer t = a;
    a = b;
    b = t;
}

public static void change(StringBuffer a, StringBuffer b)
{
    a = a.append("1");
    b = b.append("2");
}

public static void main(String[] args)
{
    StringBuffer a = new StringBuffer("First");
    StringBuffer b = new StringBuffer("Second");
    swap(a, b);
    System.out.println(a + " " + b);
    change(a, b);
    System.out.println(a + " " + b);
}

出力:

First Second
First1 Second2

First Secondの代わりに出力で得られる例からわかりますSecond First。これは、関数swapで、メインの参照に影響を与えないコピーが使用されているためです。このように、渡された変数は同じオブジェクトへの参照のまま変更できないという事実が示されています。ただし、参照されたオブジェクトを変更できるchangeため、関数は目的の効果をもたらします。

詳細については、次を参照してください:
Java は「参照渡し」ですか?

于 2012-12-27T22:34:55.510 に答える
5

Javaは値渡しです。この参照は値渡しされ、コピーされます。元の配列を指し続けます。

int[] arrayToPass
于 2012-12-27T22:30:47.837 に答える
2

これはあまり人気のない考え方かもしれませんが、私は C/C++ の側にいるので、簡単に理解できました。

Java では、オブジェクトは参照型です。つまり、実際のオブジェクトはヒープのどこかにあり、実際に使用するのはそのオブジェクトへの単なる参照です。したがって、C ポインターの観点から考える方が簡単です (類推として)。

Classname object;

C/C++ では以下のように動作します

Classname *object;

同様に、関数の場合、関数のパラメーターがポインターとして渡されるかのように動作します。C で参照渡しをシミュレートする方法に似ています。

void Function(Classname object)

以下のCバージョンに似ています

void Function(Classname *object)

また、ポインター自体の値を変更しない限り (Java では、新しいインスタンスで変数を再割り当てすることによって)、それを使用して元のインスタンスにアクセスして変更できます。

まとめると、プリミティブ型 ( 、、など)以外のすべての型は参照型です ( 、 、 、配列などの型も) 。intdoublebooleanIntegerDoubleBoolean

したがって、他の人がすでに説明したように、期待どおりに動作するためにを追加する必要はありません&(新しいインスタンスでの再割り当てなどの特定の警告を除く)。

于 2012-12-27T22:50:20.980 に答える
0

リストを受け入れるように関数パラメーターを変更できますか?

java.util.Arrays の静的メソッド asList は、配列をストレージとして使用する List を返す必要があります。

class Example
{
  public static void changeArray( List t )
  {
    //
  }
}

// a caller
int[] test = new int[5];
Example.changeArray( Arrays.asList( test ) ); //list backed with array

これについては後でレビューします。

于 2012-12-27T22:45:49.547 に答える