java 为什么下面的输出是正确的?[duplicate]

t5zmwmid  于 2023-01-24  发布在  Java
关注(0)|答案(3)|浏览(118)
    • 此问题在此处已有答案**:

Assigning Array to new variable, changing original changes the new one(4个答案)
Problem with assigning an array to other array in Java(4个答案)
How can an integer array be a reference type?(2个答案)
3天前关闭.

public class Alle {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4};
        int [] y = arr;
        y[0] = 15;
        System.out.println(Arrays.toString(arr));
    }

}

输出是15,2,3,4,但是为什么?我从来没有改变"arr"。

8fq7wneg

8fq7wneg1#

在Java中,数组是对象,而不是原语类型。当你把link to arr赋给新变量时,y仍然指向arr,所以你实际上是在改变arr。就是这样。但是如果你想复制数组,你可以使用这个方法:Arrays.copyOf(int[] original, int newLength)

uklbhaso

uklbhaso2#

假设你有一个儿子,名叫Jackson。你把他介绍给你的朋友,“嘿,朋友,见见我的儿子Jackson”。朋友说,“嗨,Jackson,我叫你杰克。”后来,朋友打电话给他说,“嘿,杰克,来拿一把糖果”。你的儿子Jackson来找你,然后你看到他有一把糖果。但是怎么会呢?你从来没有给过Jackson糖果。但是你的朋友给了杰克。有道理吗?
在你的代码中,arr和y是完全相同的实体,不是相等的,不是复制的,而是完全相同的对象,所以你在一个地方做了改变,它也会在另一个地方显示出来。

nnsrf1az

nnsrf1az3#

当您初始化整数数组arr时,在您执行以下代码时,它会在堆中为引用变量arr分配一个空间:

int[] arr = {1,2,3,4};

这个arr是指堆中的整数数组,因为数组在java中是对象。
现在,当您执行以下代码时:

int [] y = arr;

这就创建了一个引用变量y,它引用了堆中与引用变量arr引用的对象相同的对象,这就是为什么无论你通过引用变量y或引用变量arr做什么改变,都会反映堆中创建的对象的改变,因为它们引用了相同的对象。
如果你想给你的引用变量y分配一个新的对象,它类似于arr数组的元素,那么你可以克隆它,下面的代码表示它:

public class Alle {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4};
        int [] y = arr.clone(); //change here
        y[0] = 15;
        System.out.println(Arrays.toString(arr));
    }

}

这将给出一个输出:

[1, 2, 3, 4]

因此,您的arr数组这次不受影响。

相关问题