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

时间:2014-10-16 00:46:40

标签: java

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

我正在学习Java。

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

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

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

  2. 排序的(a);

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

  4. 所以我的问题是:

    在第2行中,如果sort()函数无效,如何检索已排序的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.length<2) return true;
            int i=1;
            while(i!=a.length)
            {
                if(a[i-1]>a[i]) return false;
                i++;
            }
            return true;
        }
    }
    

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

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

然后输出将是:

[3, 2]
[2, 3]

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

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

答案 2 :(得分:0)

sort(int[] a),虚函数,不返回值

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

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

当你按价值传递一个物体&#34;对于方法,将获取该对象的副本,并将该副本传递给该方法。因此,在被调用的方法中,当您修改对象时,修改不会反映在调用方法中。

当您通过引用&#34;传递对象时#34;对于一个方法,只有一个指向它所引用的实际对象的指针被传递给该方法。因此,在被调用的方法中,当您修改对象时,修改会反映在调用方法中。

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

现在,所有对象变量都是Java中的引用。所以在这种情况下,数组是一个参考。 Java按值传递该数组引用,即它需要&#34;引用&#34;的副本。传递它。

所以你现在可以想象两个指向同一个数组的指针 - 原来的一个名为&#34; args&#34;在main()和新的名为&#34; a&#34;在sort()

由于底层数组是相同的,因此如果使用指针&#34; args&#34;修改数组并不重要。在main()或指针&#34; a&#34;分类()。他们都会看到变化。

这也是为什么交换不能像你期望的那样工作的原因。

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; 
}