我一直在使用return语句编写各种方法,但最近我被告知只是将方法保留为void并且您的参数将被更改
简单地
mergeSort(a);
System.out.println(Arrays.toString(a));
将打印一个已排序的数组a。
为什么这是真的?如何在不返回的情况下更改参数。
我习惯使用脚本语言,也许这就是混乱。
答案 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
,指向相同的内存位置,但它会有不同的内容。