Java 为什么会打印5781119? 公共静态无效神秘(int[]数据) { 对于(int k=0;k

Java 为什么会打印5781119? 公共静态无效神秘(int[]数据) { 对于(int k=0;k,java,Java,这让我困惑;神秘不是空虚吗?它不应该更新任何值 5. 7. 8. 11 19在调试器模式下运行它,这样您就可以了解它为什么会这样打印。 为了解释发生了什么,理解Java的参数传递非常重要;尤其是 首先定义术语“按值传递”“语义和“按引用传递””是谨慎的: 传递值:完全计算实际参数(或参数表达式),并将结果值复制到用于在方法/函数执行期间保存形式参数值的位置。该位置通常是应用程序运行时堆栈上的一块内存(这是Java处理它的方式),但其他语言可能会选择不同的参数存储 按引用传递:形式参数仅作为实际

这让我困惑;神秘不是空虚吗?它不应该更新任何值 5. 7. 8. 11
19

在调试器模式下运行它,这样您就可以了解它为什么会这样打印。

为了解释发生了什么,理解Java的参数传递非常重要;尤其是

首先定义术语“按值传递”“语义和“按引用传递””是谨慎的:

  • 传递值:完全计算实际参数(或参数表达式),并将结果值复制到用于在方法/函数执行期间保存形式参数值的位置。该位置通常是应用程序运行时堆栈上的一块内存(这是Java处理它的方式),但其他语言可能会选择不同的参数存储
  • 按引用传递:形式参数仅作为实际参数的别名。只要方法/函数使用形式参数(用于读取或写入),它实际上就是在使用实际参数
Java严格按值传递,与C中完全相同。请参阅Java语言规范(JLS)中的以下引用:

调用方法或构造函数时(§15.12) 实际参数表达式初始化新创建的参数 每个声明类型的变量,在执行 方法或构造函数。中显示的标识符 FormalParameter可以用作方法体中的简单名称 或构造函数来引用形式参数

参数表达式(可能如上所述重写)如下 现在求值以生成参数值。每个参数值 恰好对应于方法的n个形式参数中的一个

与所有Java对象一样,数组也是按值传递的。但是,该值是对数组的引用。因此,当您在被调用的方法中将某些内容分配给数组的一个单元格时,您将被分配给调用者看到的同一个数组对象

在您共享的代码段中:

publicstaticvoidmain(字符串[]args)
{
int[]值={5,2,1,3,8};
神秘(值);//此调用将按值传递引用
for(int v:值)
System.out.println(v+“”);
}
神秘(值)
将通过值传递对数组的引用,接收器的操作
神秘(int[]数据)
将修改该引用所指向的数组

void
是一种返回类型,由于Java是一种类型化语言,它意味着
神秘(int[]数据)
所期望的结果类型


您可以阅读更多关于它的内容

Void是一种不返回任何内容的返回类型。data[k+1]=data[k]+data[k+1];Java是数组的按引用传递,数组实例将被更新。
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 + " ");


}