2014-10-16 3 views
0

Я начинаю программировать, и у меня вопрос относительно возвращаемого значения от функции.Почему функция void возвращает значение?

Я изучаю Java.

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

Теперь очевидно, что код из книги работает. Тем не менее, эти три строки в основной функции являются основой моего вопроса:

  1. ИНТ [] а = новый INT [] {1,9,2,8,3,7,4,6,5} ;

  2. вид (а);

  3. if (по возрастанию (a)) System.out.println («Works»);

Так что мой вопрос:

В строке 2, как я могу получить отсортированный а [], если функция сортировки() является недействительным?

И не должно быть: a = sort (a)?

public class SelectionSort 
{ 

    public static void main(String[]args) 
    { 
     int []a=new int[]{1,9,2,8,3,7,4,6,5}; 
     sort(a); 
     if(ascending(a)) System.out.println("Virðist virka"); 
     else System.out.println("Virkarekki"); 
    } 

    public static void sort(int[]a) 
    { 
     if(a.length<2) return; 
     int i=0; 
     while(i!=a.length) 
     { 
      int k=i+1; 
      while(k!=a.length) 
      { 
       if(a[k]<a[i]) 
       { 
        int tmp=a[i]; 
        a[i]=a[k]; 
        a[k]=tmp; 
       } 
      k++; 
      } 
     i++; 
     } 
    } 

    public static boolean ascending(int[]a) 
    { 
     if(a.length<2) return true; 
     int i=1; 
     while(i!=a.length) 
     { 
      if(a[i-1]>a[i]) return false; 
      i++; 
     } 
     return true; 
    } 
} 
+3

Метод 'sort' изменяет массив, который вы передаете, поэтому вам не нужно иметь тип возврата. – August

+0

Как указано в @August, метод 'sort' изменяет исходный массив. Это связано с тем, как Java обрабатывает параметры: http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value – Alex

ответ

2

Поскольку массивы являются объектами, они передаются по их ссылке (их расположение в памяти), так что изменения в пределах sort()a[], чтобы также изменить a[] объявлены в основном. Таким образом, a изменяется в пределах функции. Тем не менее, вы не можете сказать

public static void change(int[] a) { 
    a = new int[3]; 
    a = {1, 2}; 
} 

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

0

Метод sort() модифицирует массив, переданный в качестве аргумента; то есть исходный массив изменяется.

Скажите, у вас есть массив a, значение которого [ 3, 2 ]; вы вызываете sort(a); если ваш код выглядит следующим образом:

// printArray is an hypothetical method 
printArray(a); 
sort(a); 
printArray(a); 

, то выход будет:

[3, 2] 
[2, 3] 

В результате нет необходимости sort() возвращать результат на всех.

Вы можете изменить способ sort(), чтобы сделать копию , отсортировать копию и вернуть ее.

0

sort(int[] a), функция void, не возвращает значение.

Вместо этого sort() изменяет массив, переданный ему на месте. Вы передали объект массива в sort(), и ваш код изменил его.

0

http://javadude.com/articles/passbyvalue.htm

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

массив в Java это просто объект-контейнер для любого типа есть ..

мимоходом объекты явы в качестве параметров аналогично прохождение в качестве ссылки - где любые изменения, вносимой в объект передается в через параметр сохранит эти изменения в вызывающем методе.

0

Вы касаетесь понятия в языках программирования, названных pass by reference vs pass by value.

Когда вы передаете объект по значению в метод, копия этого объекта берется и эта копия передается методу. Таким образом, в вызываемом методе, когда вы изменяете объект, модификация не отражается в методе вызывающего абонента.

Когда вы «передаете объект по ссылке» методу, передается метод только указателю на фактический объект, к которому он обращается. Таким образом, в вызываемом методе, когда вы изменяете объект, модификация действительно отражается в методе вызова.

В Java все аргументы метода передаются по значению. Легче думать, что он проходит по ссылке, но это не так.

Теперь все переменные объекта являются ссылками на Java. Поэтому в этом случае массив является ссылкой. Java передает эту ссылку массива по значению i.e он берет копию «ссылки» и передает ее.

Таким образом, вы можете теперь представьте два указатель на тот же массив - оригинальные один названные «арг» в основном() и новом под названием «а» в своем роде()

Поскольку основной массив такого же, неважно, измените ли вы массив с помощью указателя «args» в main() или указателя «a» sort(). Они оба увидят это изменение.

Это также причина - почему своп не будет работать так, как вы ожидали бы.

void main() 
{ 
    badSwap(arr1, arr2); 
    // arr1 and arr2 will still point to same values as the prior line 
    // because only the reference pointers are getting swapped 
    // however, arr1[0] will be -99 
} 

void badSwap(int[] a, int[] b) 
{ 
    a[0] = -99; 
    int[] temp = a; 
    a = b; 
    b = temp; 
} 
Смежные вопросы