5

私のコードは次のとおりです。

public class MyProgram {
    public void start() {
        int a = 1; 
        int[] b = { 1, 2, 3}; 
        int[] c = { 1, 2, 3}; 

        method1(a,  b[0], c); 

        System.out.println("a   = " + a); 
        System.out.println("b[0]   = " + b[0]); 
        System.out.println("c[0]   = " + c[0]); 
    }

    private  void method1(int x, int y, int[] z) {
        x++; 
        y = 10; 

        if ( z.length >= 1   ) {  
            z[0] = 100;  
        }
        System.out.println(x); 
        System.out.println(y); 
    }
}

出力は

a   = 1
b[0]   = 1
c[0]   = 100

なぜc[0]だけが変わったのか本当にわかりません。

4

7 に答える 7

3

private void method1(int x, int y, int[] z)

タイプはプリミティブであるため、値によって渡されることに注意してくださいint(値はコピーされます)

また、int[]typeは配列であるため、参照によって渡されます(配列への参照が渡されます)

したがって、int変数を変更すると、コピーが変更されます。これらは、その関数の範囲外の変数には影響しません。

配列を変更すると、渡された参照を介して行われるため、変更は保持されます。

于 2012-10-26T04:35:55.727 に答える
2
 if ( z.length >= 1   ) {  
        z[0] = 100;  
    }

ここで変更したため、配列は「参照値」によって渡されます(この参照の別のコピーは、同じオブジェクト/配列を指します)。

したがって、ここで何が起こるかは、次のコードが実行されるときです。

method1(a,  b[0], c); 

'c'参照値をmethod1に渡します。

内部method1では、この参照値のコピーに配列を割り当てていないnewため、この参照に対する操作は元の配列に反映されます。

したがって、更新はインデックスz[0]に反映されます。c[0]

于 2012-10-26T04:34:17.270 に答える
1

配列は参照によって渡され、他の変数はローカルであるためです。

于 2012-10-26T04:34:04.900 に答える
1

Javaのメソッドに変数を渡すときは、それらの「値」を渡します(Javaは値渡しのみをサポートしているため)。配列やオブジェクトなどの「参照型」変数の場合でも、それらの値を渡しますが、それらの値は、データが実際に格納されているメモリ内のどこかへの参照です。

したがって、method1メソッド内で配列に変更を加えると、配列の実際の内容が変更されます。

メモリの例:

                    (someplace in memory)
 -------            --------------
|   c   |  ----->   |     1      |   0
 -------            |     2      |   1
                    |     3      |   2
                    -------------- 

メソッドに渡すcと、メソッドのパラメーターは「値」を取得します。この値の「値」は、c実際には、配列データが格納されているメモリ内のスペースへの参照またはポインターです。メソッドで行った変更はc、メモリ内の同じ場所を指しているため、配列に反映されます。

                    (someplace in memory)
 -------            --------------
|   c   |  ----->   |    100     |   0
 -------            |     2      |   1
                    |     3      |   2
                    -------------- 
于 2012-10-26T04:36:31.570 に答える
1
method1(a,  b[0], c);

Javaでは、すべてが値によって渡されるため、最初の2つのパラメーター、、aおよびb[0]は、呼び出されたメソッドで変更された場合、呼び出し元のメソッドに影響を与えません。なぜなら、変更すると値が変更され、元の値は変更されないままになるからです。

ただし、3番目のパラメーターcは配列の参照です。これも値によって渡されます。したがって、これをメソッドに渡すと、参照のコピーが作成され、呼び出されたメソッド(z)のパラメーターも同じ配列オブジェクトを指します。

これで、渡された参照を使用して配列に加えた変更は、その配列を指すすべての参照に反映されます。

private  void method1(int x, int y, int[] z)

したがって、このメソッドでは、xおよびはととy同じ値を含む異なる変数です。一方、は、元の参照が指すのと同じオブジェクトを指す別のアドレスを持っています。abzreferencearrayc

         c[0] c[1] c[2]
         z[0] z[1] z[2] // So, if you change `z[0]`, `a[0]` will also see the change

c ---->  [ 1,   2,   3 ] -> // Any change in the array is reflected in 
          ^                 // both the reference a and z
          |
          |
z --------+

a -> someValue
x -> someValue -> // If we change this, the `someValue` for `a` won't be changed.
于 2012-10-26T04:37:10.810 に答える
0

なぜ変わらないのですか?

cは配列オブジェクトを指しています。cをmethod1に渡す場合、cのコピー(配列自体ではなく、ポインター/参照)がzとして渡されます。ただし、zは、cが指しているのと同じ配列インスタンスを指し続けています。その配列インスタンスのコンテンツをzを介して変更した場合、もちろん、後でcを介してアクセスしたときに反映されます。

于 2012-10-26T04:35:53.247 に答える
0

メソッドmethod1には3つのパラメーターがあり、最初の2つはプリミティブint型で、最後の1つは配列型です。Javaは参照によってメソッド引数を渡しません。それらを値で渡します。

プリミティブ型はオブジェクトではないため、プリミティブ型のコピーがメソッド1に渡されます。

Javaは、オブジェクトではなく値によって参照をコピーして渡すことを理解する必要があります。Javaでオブジェクトを作成するときは、その参照を介してそのオブジェクトにアクセスします。method1を呼び出すと、javaは配列への参照を取得し、その参照のコピーを作成して、method1に渡します。これは、配列を指す2つの参照があることを意味します(1つはstartメソッドに、もう1つはmethod1メソッドにあります)。したがって、method1で使用されている参照は配列を指しているため、method1で行われた変更は最終的に配列に影響を与えます。

于 2012-10-26T04:47:23.960 に答える