这是怎么回事Java代码

这是怎么回事Java代码,java,Java,我有这段代码 package test1; class Student13 { public static void main(String [] args) { Student13 p = new Student13(); p.start(); } void start() { long [] a1 = {3,4,5}; long [] a2 = fix(a1); Sy

我有这段代码

package test1;
class Student13
{
    public static void main(String [] args) 
    {
        Student13 p = new Student13();
        p.start();
    }

    void start() 
    {
        long [] a1 = {3,4,5};
        long [] a2 = fix(a1);
        System.out.print(a1[0] + a1[1] + a1[2] + " ");
        System.out.println(a2[0] + a2[1] + a2[2]);
    }

    long [] fix(long [] a3) 
    {
        a3[1] = 7;
        return a3;
    } 
}

你能告诉我为什么它返回
15
,而不是
12 15
?函数
fix
仅应用于
long[]a2
,因此最终结果是
15

a1[]
的引用作为参数传递给
fix()
,这就是基本原因

调用
fix()
后,
a1[]==a2[]


a2[]
指向
a1[]
a1[]
总和现在是15,因此
a2[]
总和也是15。

将a1数组传递给
fix()
,在
fix()
方法中称为
a3
,但仍然引用
a1
。因此,当您更新
a3
a3[1]=7
时,您实际上更新了
fix()
的参数值,它是
a1
。因此,您更新了
a1

排队

long a1[] = { ... };
您正在创建一个数组对象。这将是整个课程剩余部分中唯一的一个

现在,我们需要

fix(a1);
在此
fix
方法中,为参数
a3
指定对该数组的精确引用。当此方法返回此引用时(
returna3;
),行

long[] a2 = fix(a1);
将相同的引用分配给变量
a2
。所以在所有点上,所有变量和参数都引用同一个数组


fix
方法正在修改该数组。因此,您所有的别名都可以看到修改。

谢谢!如果我把fix函数放在第一个println之后,最终结果是12和15,对吗?如果你放:
long[]a2=fix(new long[]{3,4,5})您的输出将为12 15。请更改标题以反映问题。数组为,因此更改将持续。