Java函数中传入引用变量,然后用引用变量生成新的对象所引发的问题

本文详细介绍了Java中对象引用与拷贝的区别,通过代码示例展示了如何通过引用变量修改对象。示例1展示了直接通过引用修改对象内容,示例2和3则说明了通过赋值操作改变引用后,原始对象不受影响。文章强调了理解对象拷贝对于避免意外修改的重要性。
摘要由CSDN通过智能技术生成

通过引用变量修改对象

像一个函数中传入引用变量,该变量指向一个堆中的一个对象。
如果利用该特性,可以通过引用变量修改堆中的对象(类比C中的指针

传入的是引用变量的一份拷贝,但是二者指向相同的对象

关于拷贝的代码示例

import java.util.Arrays;

public class Test0 {
    public static void main(String[] args) {
        int[] array = new int[]{1};
        changeArray(array);
        System.out.println(Arrays.toString(array));
    }

    public static void changeArray(int[] copy) {
        int[] tmp = {0};
        /* method 1 */
        /* change original array */
        copy[0] = tmp[0];

        /* method 2 */
        /* not change original array */
        copy = tmp;

        /* method 3*/
        /* not change original array */
        copy = Arrays.copyOf(tmp, tmp.length);
    }
}

我们采用拷贝的思想,逐一分析上述三个例子
为简洁的说明情况,用 original 原来的引用变量, copy 代表传入的一份拷贝

示例1

originalcopy 都指向同一个对象,copy 取下标就可以修改对象的内容

示例2

originalcopy 指向同一个对象,tmp 指向另一个对象。copy = tmp,则 copytmp 指向同一对象,则 copyoriginal 指向的对象不同,所以修改 copy 对原来的对象无影响

示例3

同上,originalcopy 开始指向同一对象,然后 copy 指向 Arrays.copyOf 所生成的对象,所以修改 copy 对原来的对象不影响。

函数中使用引用变量的拷贝 来生成新的对象

通过对拷贝的理解,可以明白为什么原有的对象没有被改变

代码示例

public class Test0 {
    public static void main(String[] args) {
        int[] array = new int[]{1};
        changeArray(array);
        System.out.println(Arrays.toString(array));
    }

    public static void changeArray(int[] copy) {
        copy = new int[1];
        copy[0] = 0;
    }
}

用几张图来说明一下

  • 这是一开始的情况
    在这里插入图片描述

然后生成了新的对象,拷贝的引用变量指向了新的对象
在这里插入图片描述

从上面可以明白,自此之后,拷贝的引用变量只会修改新的对象 ,而不会对原来的对象 产生任何影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值