2015-06-25 3 views
-2

Так что я получил этот кусок кода,Как это работает? - Java-код

package test1; 
class Student13 
{ 
    public static void main(String [] args) 
    { 
     Student13 p = new Student13(); 
     p.start(); 
    } 

    void start() 
    { 
     long [] a1 = {3,4,5}; 
     long [] a2 = fix(a1); 
     System.out.print(a1[0] + a1[1] + a1[2] + " "); 
     System.out.println(a2[0] + a2[1] + a2[2]); 
    } 

    long [] fix(long [] a3) 
    { 
     a3[1] = 7; 
     return a3; 
    } 
} 

Можете ли вы сказать мне, почему она возвращает 15 15 и не 12 15? Функция fix применяется только для long[] a2, так как получилось, что конечный результат 15 15?

+1

Пожалуйста, измените название, чтобы узнать об этом. –

+0

Массивы [переданы по ссылке] (http://stackoverflow.com/a/12757853/3773066), поэтому изменения будут сохраняться. – OhBeWise

ответ

0

Отнесение a1[] передается в качестве параметра fix(), поэтому в основном

a1[] == a2[]fix() после вызова.

a2[] указывает на a1[] но a1[] сумма теперь 15, поэтому a2[] сумма также 15.

1

Вы передаете массив a1 в fix(), который называется a3 в методе fix(), но независимо от еще ссылки a1 , Поэтому, когда вы обновляете a3: a3[1]=7, вы фактически обновляете значение параметра fix(), которое было a1. Таким образом, вы обновили a1!

+0

Спасибо! Итак, если бы я поставил функцию fix после первого println, то окончательный результат был бы равен 12 и 15, верно? – stack404

+0

Если вы положили: 'long [] a2 = fix (новый long [] {3,4,5}),' ваш вывод будет 12 15. –

+0

Да, это было бы правильно –

1

В строке

long a1[] = { ... }; 

вы создаете один объект массива. Это будет единственное место в остальной части программы.

Теперь вызов

fix(a1); 

назначает ссылку на этот массив точно к параметру a3 в этом fix методе. Поскольку этот метод возвращает эту ссылку (return a3;), линия

long[] a2 = fix(a1); 

будет назначать ту же ссылку на переменную a2. Таким образом, во всех точках все переменные и параметры относятся к одному и тому же массиву.

Метод fix модифицирует этот массив. Так что модификация замечена всеми вашими псевдонимами.

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