2012-04-22 2 views
-2

В следующем коде, почему arr2 [0] все еще равен 1,5, хотя исходный массив изменен в методе2? Игнорируйте другие массивы и переменные.Массивы и их передача по ссылке

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

В основном, потому что 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; 

Для получения более подробной информации см. Это answer.

2

потому, что вы изменили ссылку на весь массив и не изменяет массив, переданный в.

При вызове method2 точки аргументов в массив, созданный снаружи. В методе2 вы указываете аргумент на новый массив. это не изменяет массив, на который указывает переменная в вызывающем методе, которая все еще указывает на исходный массив.

Если вы просто изменили существующий массив, который вы указали в методе2, вы увидите эти изменения в вызывающем методе.

-1

Я считаю, что Java использует семантику передачи передаваемых значений по значению. Объявив float[] arr2 в PSVM(), его область действия ограничена там, и если вы передадите массив другой функции, он будет передан по значению.

Если, с другой стороны, вы объявили float[] arr2вне из PSVM() (но в пределах определения класса), то его объем будет глобальным в классе. Тем не менее, я все еще не думаю, что ваш код будет работать, потому что IIRC, вы не можете назначить значение целого массива с одним присваиванием, как ваш код, в method2().

Смежные вопросы