通过数组来理解引用

前言

数组本身很简单,但是通过学习数组,我们可以加深对引用的理解,这也是学习链表的基础,希望这篇文章能对你有帮助。

先搞清楚是什么的问题

认识数组

数组就是 相同数据类型元素的一个集合

认识引用变量

引用变量就是存放地址的变量,这个和c语言的中指针中的定义不能说很像,只能说一模一样。

认识null

null在java中表示空引用,即不指向任何一个对象

数组的创建和初始化

public class Test1 {
    public static void main(String[] args) {
        int []arr1=new int[10];//动态初始化,arr1数组里面默认放了十个零
        int []arr2=new int[]{1,2,3};//静态初始化,通过放的内容来判断开辟的数组的大小
        int[] arr3={1,2,3,4};//甚至new int还可以省略
    }
}

什么动态初始化,静态初始化这些名词,可以不用管,不用记,但是需要记住的是没有放元素的时候,默认放的是0

数组怎么和引用变量扯上关系的

数组名存放的是数组的地址,所以数组名是引用变量

局部变量(方法体中的变量) 在虚拟机栈区(具体是什么以后再深入了解),对象一定在堆上,但是引用变量不一定在栈上(当即使成员变量又是引用变量的时候在方法区),如果现在不知道什么是成员变量也没关系 。
记住对象一定在堆上引用变量不一定在栈上就行
三者之间的关系
在这里插入图片描述

引用变量(数组名)和对象(数组)之间的关系
局部变量

再谈引用变量

请问以下代码输出什么?

  public static void main(String[] args) {
        int []arr1=new int[3];
        arr1[0]=10;
        arr1[1]=20;
        arr1[2]=30;
        int []arr2=new int[]{1,2,3,4,5};
        arr2[0]=1;
        arr2[1]=2;
        arr1=arr2;
        arr1[2]=300;
        arr1[3]=400;
        arr1[4]=500;
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i]+" ");
        }
    }

或许你会想什么都不输出,数组越界?其实正确答案1 2 300 400 500不知道你做对没

====================================================================

ok,现在开始揭晓谜题。
在这里插入图片描述

在运行arr1=arr2之前的一步,如图是这样的情况。相信大家都没问题,令人困惑的是arr1=arr2什么意思。
arr1=arr2的意思是把arr2里面存的东西给arr1如同int a=6,b=2; a=b;一样把b里面存的二赋值给a这里是把arr2里面存的地址赋值给arr1

在这里插入图片描述

由于arr1存的是ox98了,所以指向改变了,同时因为原先的数组那个空间没有引用能找到了,所以就被回收了。也就是不存在了。再执行arr1[2]=300; arr1[3]=400;arr1[4]=500;就好理解了

在这里插入图片描述

数组的应用场景

作为函数的参数

请问以下代码输出什么?

public static void main(String[] args) {
        int []arr= {1,2,3,4};
        fun(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }
    public static void fun(int[]arr){
        arr1[0]=99;
    }

解析:
arr和arr1指向同一片空间
在这里插入图片描述

当arr1[0]=90的时候 把arr指向的东西也改了(因为他们指向的是同一个东西

在这里插入图片描述

请看以下代码,请问输出什么?

public static void main(String[] args) {
        int []arr= {1,2,3,4};
        fun(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }
    public static void fun(int[]arr1){
        arr1=new int[7];
    }

解析
arr里面的值传给arr1的时候他们共同指向一个空间
在这里插入图片描述
arr 1=new int [10];
现在arr1,和arr分别指向两个空间,arr1和arr互不影响,所以打印出来是 1 2 3 4
在这里插入图片描述

作为函数的返回值

举个栗子 ,请看以下代码

public static void main(String[] args) {
        int []ret= fun();
        for (int i = 0; i < ret.length; i++) {
            System.out.print(ret[i]+" ");
        }
    }
    public static int[] fun(){
        int []arr={1,2,3,4};
        return arr;
    }

这个代码不难理解,但是有些小细节还是值得提一下
fun()方法运行完时如图
在这里插入图片描述

出了fun()方法arr这个局部变量就被销毁了,但是arr里面的值赋值给了ret,所以开辟的空间还有引用指向它,所以它没被销毁。

在这里插入图片描述

小结:

画图对学习编程有很大的帮助,在这里能帮助我们理解引用。在今后的学习中,尤其是数据结构,画图更能帮我们理清思路,所以请多画图,多调试,来理解代码。希望能对你有帮助,祝你学业顺利,平安健康。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值