为什么数组可以通过形参改变实参

文章详细阐述了Java中基本数据类型和引用数据类型的差异,特别是数组作为引用数据类型时,变量存储的是对象地址而非实际值。通过示例展示了即使内容相同的数组,其内存地址也是不同的,且赋值操作不会改变地址,只会让两个引用指向同一对象。同时,文章讨论了Java的参数传递机制,值传递和引用传递的区别,以及在方法中修改数组时的注意事项,强调了直接修改数组引用可能导致的意外后果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基石

//了解引用数据类型可跳
Java数据类型分两种,基本数据类型和引用数据类型,数组属于引用数据类型。
基本数据类型所存的是所定义变量的数值。
引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。

import java.util.Arrays;
public class Study {
    public static void main(String[] args){
        int []a=new int[]{1,2,3};
        int []b=new int[]{1,2,3};
        System.out.println(Arrays.toString(a));//输出数组a
        System.out.println(Arrays.toString(b));//输出数组b
        System.out.println(a);//变量a所存的地址
        System.out.println(b);//变量b所存的地址
        
        
        System.out.println(Arrays.equals(a,b));//判断数组a与数组b的内容是否相同//true
        System.out.println(a==b);//判断a与b的地址是否相等//false

    }
}
[1, 2, 3]
[1, 2, 3]
[I@28d93b30
[I@1b6d3586
true
false

需要注意的是,哪怕开始时给数组的内容是一样的,地址也会不同,但是你令a=b后,两个地址就会相同,指向同一个空间。

import java.util.Arrays;
public class Study {
    public static void main(String[] args) {
        int[] a = new int[]{1, 2, 3};
        int[] b = new int[]{1, 2, 3};
        System.out.println(a);
        System.out.println(b);
        a=b;
        System.out.println("-----------");
        System.out.println(a);
        System.out.println(b);
    }
}
[I@28d93b30
[I@1b6d3586
-----------
[I@1b6d3586
[I@1b6d3586

原理

Java的形参传递针对它的两种数据类型也有不同的传递方式。

如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值,称为值传递。
如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值,称为引用传递。

当然,传递的不是实参本身,相当于做了一个复印件给了形参,因此,一般情况下,对形参的改动不影响实参,但是引用数据类型是特殊的,做一个比喻就是,像是一张便利贴,标明为一号便利贴,值传递是又写了一个便利贴为二号,内容和一号一样,但在上面改动不会影响一号;引用传递则是三号便利贴,写了一号便利贴藏的地点,可以以此找到一号进行更改。
以上的比喻,可以恰恰好的解释另一个容易忽视的问题------我不改内容,我改地址会不会也可以。(相当于我不去找地点,我就在三号便利贴上改改地址)
很遗憾,不可以。方法可以通过拷贝的地址更改地址指向的内容,但不允许更改地址
以下代码和段落来自更改示例(GatasMa前辈的文章)
原文链接:https://blog.youkuaiyun.com/qq_40456064/article/details/94594037

import java.util.*;

import static java.lang.StrictMath.floorMod;

public class Test {

    public static void main(String[] args) {

        int [] array = {1};
        reOrderArray(array);

        System.out.println(Arrays.toString(array));

    }

    public static void reOrderArray(int [] array){

        int [] tempArray = {0};

//        1. --------------
//        for(int i = 0;i < array.length;i++) {
//            array[i] = tempArray[i];
//        }
//        2. --------------
//        array = tempArray;

//        3. --------------

//        array = Arrays.copyOf(tempArray, tempArray.length);
    }
}

————————————————
定义了一个无返回值的方法,传入一个array数组,在方法中对数组进行修改,采用1、2、3的方法对array数组进行修改,方法结束后得到的数组是不一样的,大家可以试一下,2、3方法对main方法里的array不能产生任何影响,只有采用1后,array数组中的值才会变化,这个点很大可能在代码中产生不必要的麻烦,所以,我建议除非自己知道,在方法里做数组拷贝时,建议循环拷贝
————————————————

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值