java第三话:从数组来了解java中的引用和java中的传址操作
发布日期:2021-05-04 20:08:16 浏览次数:24 分类:技术文章

本文共 3564 字,大约阅读时间需要 11 分钟。

从数组来真正开始了解java与C的区别

上一话中,我们谈到了java中的数据类型和操作符,我们有一种感觉,就是和C感觉没有很大差别

那么从这篇博文中,我们就可以真正了解一些不一样的东西
首先,让我们来了解一下数组吧!

数组

java中如何创建数组

那么什么是数组呢?即储存相同元素的集合

在java中,我们可以有如下定义数组的方式

int[] arr1 = {   1,2,3,4,5,6,7,8,9};        int[] arr2 = new int[]{   1,2,3,4,5,6,7,8,9,10};        int[] arr3 = new int[20];        System.out.println(Arrays.toString(arr1));        System.out.println(Arrays.toString(arr2));        System.out.println(Arrays.toString(arr3));        //输出结果:        //[1, 2, 3, 4, 5, 6, 7, 8, 9]        //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]        //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

如何访问和修改数组

既然知道了如何创建数组,我们再来了解一下如何对数组进行访问和修改

同C语言一样,java中的数组可以用’[ ]'来对数组进行访问,如下面代码

int[] arr = new int[50];//数组名.length可以获取数组的长度        for (int i = 0; i < arr.length; i++) {               arr[i] = i+1;        }        for (int i = 0; i < arr.length; i++) {               System.out.print(arr[i]+" ");        } //输出结果: //1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43             // 44 45 46 47 48 49 50

foreach循环

java中还有一个特别的遍历方式就是foreach循环

int[] arr = {   1,2,3,4,5,6,7,8,9,10};        for (int x:arr) {   //格式 临时变量:数组名            System.out.print(x+" ");        }        //输出结果:        //1 2 3 4 5 6 7 8 9 10

foreach的代码意思是每次循环的时候会定义一个临时变量x(或者其他),同时将数组的元素拷贝在x上,然后对x进行操作。(所以无法用foreach对数组进行赋值,只能读取数组的值)

如何在java中进行传址操作

引用

我们知道如果在一个方法(或者函数中)想要交换传进来的两个值,如果只进行传值操作是无法完成两个数的交换的,如下图代码

public static void main(String[] args) {           int a = 10;        int b = 20;        System.out.println(a);        System.out.println(b);        swap(a,b);        System.out.println(a);        System.out.println(b);    }    public static void swap(int a,int b){           int tmp = a;        a = b;        b=tmp;    }    //输出结果:    //10    //20    //10    //20

当然,在C语言中我们可以使用&来获取地址从而进行传址操作来解决这个问题,那么在java中如何解决这种问题呢?

那就是传引用
何为引用?
在这里我们就要回想到java的数据类型,在上文中我们说过,java有八大基本数据类型还有引用类型,如下图
在这里插入图片描述
谈到引用类型,我们不可避免的要说到new这个关键字

new关键字

new可以简单理解为创建对象的关键字,也可理解为在堆区开辟内存的关键字,如下图代码

public static void main(String[] args) {           int[] arr = new int[10];            }

接下来让我们来分析一下这段代码有什么具体含义,我们用下图来做为讲解

当函数运行到main函数的时候,会在栈区为main函数开辟一块栈帧(也就是内存块),然后,我们创建了一个名叫arr的数组。
使用new关键字在堆区开辟了一块内存区域,用来存储新创建的对象。
这时,数组名就存储在栈帧中,这个数组名就叫做引用,那么存储的是啥呢?是数组在堆区中所存放的地址
(这里我们假设数组在堆区的地址是0x555,那么arr这个引用存储的也就是0x555)

在这里插入图片描述

在这,我们和C语言做个小对比,我们知道,C语言只有用内存开辟函数如malloc calloc realloc 才能在堆区中开辟空间。
而在java里面,我们使用new 就可以在堆区中开辟空间。

我们可以做一个小实验来证明引用中存的是否是地址,具体看下图代码

public static void main(String[] args) {           int[] arr1 = {   1,2,3,4,5,6,7,8,9};        int[] arr2 = new int[]{   1,2,3,4,5,6,7,8,9,10};        int[] arr3 = new int[20];        System.out.println(arr1);        System.out.println(arr2);        System.out.println(arr3);    }    //输出结果:    //[I@1b6d3586    //[I@4554617c    //[I@74a14482

可见,数组名存的是地址,但是,虽然是地址,但java中并没有指针,因此也就没有了很多像C一样对指针的操作。

由此,我们受到启发,java中引用类型的引用存的是地址,是所对应的对象的地址

传引用

回到我们交换两个数的问题,我们就可以通过传数组来解决

public static void main(String[] args) {           int[] arr = {   10,20};        System.out.println(arr[0]);        System.out.println(arr[1]);        swap(arr);        System.out.println(arr[0]);        System.out.println(arr[1]);    }    public static void swap(int[] arr){           int tmp = arr[0];        arr[0] = arr[1];        arr[1]=tmp;    }    //输出结果:    //10    //20    //20    //10

为啥传引用可以解决这个问题呢?因为引用里面存的是地址,我们对引用进行操作,相当于直接在堆区里面操作数组,所以,直接修改的就是数组本身,也就达到了我们的效果。

最后,我们来做一个小总结

java中的引用是什么?是一个地址。
java中如何进行传址操作? 通过传引用。
(具体理解栈区和堆区里,引用和对象的关系很重要)
到这,我相信你已经对java的引用和java传址操作有了一定了解了,至于更多有关数组的知识,我会在之后的博文中更新,希望这篇文章对你有所帮助。

感谢观看,如有错误,欢迎指正。
上一篇:java第四话:数组知识点讲解
下一篇:C语言最终话:源码变成可执行程序的深入了解+预处理详解

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年03月28日 09时00分57秒