-2

次のコードで、元の配列が method2 で変更されているにもかかわらず、arr2[0] が 1.5 のままなのはなぜですか? 他の配列と変数は無視してください。

public class Problem3
{
    public static int method1(int[] array)
    {
        array[0] += 10;
        return array[0];
    }

    public static int method2(int aNum, String aStr,
        int[] array1, float[] array2, int[] array3)
    {
        float[] fNums = {1.5F, 2.5F};
        array2 = fNums;

        return 10 + method1(array3);
    }

    public static void main(String[] args)
    {
        int num = 1000;
        String aStr = "Hello!";
        int[] arr1 = {1, 2, 3};
        float[] arr2 = {0.5F, 1.5F};
        int[] arr3 = {5, 6, 7};
        int retNum = method2(num, aStr, arr1, arr2, arr3);

        System.out.println(arr2[0]);
    }
}
4

3 に答える 3

2

配列全体への参照を変更し、渡された配列を変更しなかったためです。

method2 を呼び出すと、引数は外部で作成された配列を指します。method2 では、引数が新しい配列を指すようにします。これは、呼び出し元のメソッドの変数が指している配列を変更せず、元の配列を指しているままです。

method2 で指定した既存の配列を単純に変更した場合、呼び出し元のメソッドでそれらの変更が表示されます。

于 2012-04-22T20:35:11.307 に答える
2

基本的に、array2は ではありませんが、呼び出し時arr2にメモリ内の同じ配列を参照します。method2

method2(num, aStr, arr1, arr2, arr3);
public static int method2(int aNum, String aStr, int[] array1, float[] array2, int[] array3)

次に、array2参照している新しい配列をfNums参照し、参照する配列を変更しませんarr2でした:

float[] fNums = {1.5F, 2.5F};
array2 = fNums;

詳細については、この回答を参照してください。

于 2012-04-22T20:42:07.943 に答える
-1

私は、Java が値渡しパラメーターの受け渡しセマンティクスを使用していると考えています。PSVM() 内で宣言することによりfloat[] arr2、そのスコープはそこに制限され、配列を別の関数に渡すと、値によって渡されます。

一方、 PSVM() のfloat[] arr2 外側(ただし、クラス定義内) で宣言した場合、そのスコープはクラス内でグローバルになります。ただし、IIRC では、あなたのコードがmethod2().

于 2012-04-22T20:41:37.843 に答える