为什么void sort方法返回参数改变了?

时间:2014-04-03 01:51:06

标签: java sorting methods

我一直在使用return语句编写各种方法,但最近我被告知只是将方法保留为void并且您的参数将被更改

简单地

mergeSort(a);
System.out.println(Arrays.toString(a));

将打印一个已排序的数组a。

为什么这是真的?如何在不返回的情况下更改参数。

我习惯使用脚本语言,也许这就是混乱。

3 个答案:

答案 0 :(得分:1)

让我们举个例子。我发现这个术语只会让人感到困惑。

你有一个字符串: String name = "Paul";

您致电System.out.println("Name is: " + rename(name, "Frank")); - > Name is: Frank 但是System.out.println("Name is: " + name); - > Name is: Paul

这是因为重命名会获得name副本name未受影响。如果要修改原始文件,重命名应如下所示:

void rename(String newName) {
    name = newName;
}

请记住,无论何时为函数提供对象,都要为其提供该对象的副本。我几乎可以肯定我没有犯错,但我现在正在启动日食以仔细检查我是否正确。

编辑:我在日食中测试了它。

完整工作示例

static String name = "Paul";

public static String rename(String originalName, String newName) {
    originalName = newName;
    return originalName;
}

public static void rename(String newName) {
    name = newName;
}

public static void main(String[] args) {
    System.out.println(rename(name, "Sally"));
    System.out.println(name); //name = "Paul"

    rename("Sally");
    System.out.println(name); //name = "Sally"
}

输出:

Sally
Paul
Sally

答案 1 :(得分:0)

数组是一个可变对象。如果您有对数组的引用,则可以对其进行修改。

我已经采用了不同响应中提供的示例,并展示了如何修改它以使用数组,然后可以修改其内容:

class Test
    {
    static final char[] name = "Paul".toCharArray();

    public static void main(String[] asArg)
        {
        System.out.println("name=" + new String(name));
        rename(name, "Mary");
        System.out.println("name=" + new String(name));
        }

    public static void rename(char[] name, String newName)
        {
        System.arraycopy(newName.toCharArray(), 0, name, 0, Math.min(name.length, newName.length()));
        }
    }

这是输出:

$ java Test
name=Paul
name=Mary

以这种方式,将引用传递给数组非常类似于将"指针传递给数组"在C中,接收该引用(指针)的方法(函数)然后能够访问和修改存储在该数组中的值。

答案 2 :(得分:-1)

按值调用和按名称调用之间存在重要区别。 Javascript是一种按值调用的语言 - 所有参数都作为值传递。但是,包含对象的变量的值是对该对象的引用;改变对象的内容不构成改变功能参数(严格来说)。即如果你致电mergeSort(a),当它返回时,a仍然是相同的a,指向相同的内存位置,但它会有不同的内容。