public static void mystery(int[] data)
{
for (int k = 0; k < data.length - 1; k++)
data[k+1] = data[k] + data[k+1];
}
public static void main(String[] args)
{
int[] values = {5,2,1,3,8};
mystery(values);
for(int v : values)
System.out.println(v + " ");
}这让我感到困惑;神秘不是空虚的吗?它不应该更新任何值5 7 8 11 19
发布于 2020-01-17 11:34:25
在调试器模式下运行它,这样您自己就可以看到为什么它会像这样打印。https://help.eclipse.org/2019-12/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftasks-debug-launch.htm
发布于 2020-01-17 12:11:53
要解释发生了什么,理解Java的参数传递是很重要的;尤其是whether it's “pass-by-reference” or “pass-by-value”。
首先,定义术语"pass-by-value“语义和"pass-by-reference”是谨慎的:
Java是严格按值传递的,与C语言完全一样。请参阅Java语言规范(JLS)中的以下引用:
当调用方法或构造函数时(§15.12),在执行方法或构造函数的主体之前,实际参数表达式的值会初始化新创建的参数变量(每个声明的类型)。出现在FormalParameter中的标识符可以用作方法或构造函数主体中的简单名称,以引用形参。
https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.1
现在计算参数表达式(可能如上所述重写)以生成参数值。每个参数值恰好对应于该方法的n个形参中的一个。
https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.12.4.2
与所有Java对象一样,数组是通过值传递的。但是,该值是对数组的引用。因此,当你在被调用的方法中给数组的一个单元格赋值时,你将赋值给调用者所看到的相同的数组对象。
在您共享的代码片段中:
public static void main(String[] args)
{
int[] values = {5,2,1,3,8};
mystery(values); // this call will pass the reference by value
for(int v : values)
System.out.println(v + " ");
}mystery(values)将通过值传递对数组values的引用,接收方mystery(int[] data)的操作将修改该引用指向的数组values。
由于void是一种类型化语言,因此它是一种返回类型,表示期望从mystery(int[] data)返回的结果的类型。
你可以在here上阅读更多关于它的内容
https://stackoverflow.com/questions/59780780
复制相似问题