2012-04-22 42 views
-2

次のコードでは、方法2で元の配列が変更されても、なぜ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]); 
    } 
} 
+0

基本的に答えは1.5だと思っていましたが、解決策は0.5と言って、誰かが説明できるかどうか疑問に思っていますか? –

+1

この回答を見る:http://stackoverflow.com/a/9404727/597657 –

+0

Javaでは参照渡しがありません – newacct

答えて

2

基本的には、:

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

を次に、あなたが作るarray2fNumsがある新しい配列を指し、あなたはarr2が返す配列を変更しなかった:

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

詳しくはanswerをご覧ください。

2

あなたは全体の配列への参照を変更して、外部の作成した配列に引数ポイントを方法2呼び出すとき。

に渡された配列を変更しなかったので。 method2では、引数を新しい配列を指すようにします。これは、元の配列を指している、呼び出し元のメソッドの変数が指している配列を変更しません。

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

-1

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

一方、float[] arr2のPSVM()の(但しクラス定義内)と宣言していた場合、そのスコープはクラス内でグローバルになります。しかし、私はあなたのコードがうまくいくとは思えません。なぜなら、IIRCでは、あなたのコードがmethod2()のように1つの割り当てで配列全体の値を代入することはできません。 array2arr2ではありませんが、彼らはmethod2を呼び出すには、メモリ内の同じ配列を参照しているため