为什么void函数返回一个值?

我是编程初学者,我对函数的返回值有疑问。

我在学习Java。

我附上了我的书中的代码,其中包含经典的选择排序。

现在显然这本书的代码可行。 但是,主要function中的这三行是我的问题的基础:

  1. int [] a = new int [] {1,9,2,8,3,7,4,6​​,5};

  2. 排序(一);

  3. if(ascending(a))System.out.println(“Works”);

所以我的问题是:

在第2行中,如果sort()函数为void,如何检索已排序的a []?

这条线不应该是: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.lengtha[i]) return false; i++; } return true; } } 

由于数组是对象,因此它们通过引用(它们在内存中的位置)传递,因此sort()a[]更改也会更改main中声明a[] 。 所以a在函数内被改变了。 但是,你不能说

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

这不会改变自身,因为它只是创建参数a指向的新内存位置,而不更改参数。

sort()方法修改作为参数传递的数组; 也就是说,原始数组被修改。

假设您有数组a值为[ 3, 2 ] ; 你叫sort(a) ; 如果您的代码如下:

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

然后输出将是:

 [3, 2] [2, 3] 

因此, sort()根本不需要返回结果。

但是,您可以修改sort()方法以生成数组的副本,对副本进行排序并返回该副本。

sort(int[] a) ,一个void函数, 不返回值

相反, sort()修改了就地传递给它的数组。 您将数组对象传递给sort()并且您的代码对其进行了修改。

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

java中的原语(如char和int)在java中按值传递。

java中的数组只是一个对象容器,无论类型是什么。

在java中传递对象作为参数类似于传递作为引用 – 您对通过参数传入的对象所做的任何修改将在调用方法中保留这些更改。

您正在探讨编程语言中的概念,名为pass by reference和pass by value。

当您“按值传递对象”到方法时,将获取该对象的副本,并将该副本传递给该方法。 因此在被调用的方法中,当您修改对象时,修改不会反映在调用方法中。

当您“通过引用将对象传递”到方法时,只有指向它所引用的实际对象的指针才会传递给该方法。 因此在被调用的方法中,当您修改对象时,修改会反映在调用方法中。

在Java中,所有方法参数都是“按值传递”。 更容易认为它是通过引用传递但事实并非如此。

现在,所有对象变量都是Java中的引用。 所以在这种情况下,数组是一个参考。 Java通过值传递该数组引用,即它获取“引用”的副本并传递它。

所以你现在可以想象两个指向同一个数组的指针 – 在main()中名为“args”的原始指针和在sort()中名为“a”的新指针

由于底层数组是相同的,如果使用main()中的指针“args”或指针“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; }