从零学java笔录-第36篇基础语法完结篇- java中值传递和地址值传递And图解

前言:

欢迎访问凯哥个人网站:www.kaigejava.com 

欢迎关注凯哥公众号:凯哥Java

本文是java基础语法最后一篇。从下节课开始,我们将进入-【从零学Java】的第二阶段-->面向对象

本节内容:

1:java中的值传递及图解

2:地址值传递及图解

3:第一阶段(基础语法)总结和第二阶段预告

本文出处:《凯哥陪你学系列之java基础篇.Java基本语法篇》中第36篇基础语法完结篇- java中值传递和地址值传递And图解

声明:本文系凯哥Java(www.kaigejava.com)原创(微信id:kaigejava)。转载请注明出处

一:java中的值传递

如下图:

问题:

①、②、③中分别输出的是什么?

我们尝试着看代码来进行分析:

在①中我们知道 输出的 a=10;b=20

然后调用了change()这个方法。

所以应该先输出③。

我们来分析 在change()方法中,参数a=10 ,参数 b=20

所以 a=b,运算之后,a的值就为20了。

而 b = a+b。其实这个时候a=20了 所以b=20+20(b是不变的)

运算之后b=40了

所以 ③输出的应该是 a = 20 b=40

然后程序回到main函数中,接着往下走,就该输出②了。

那么请问②处输出多少?是 a=10 b=20 还是 a=20 b=40?

我们先运行下,看下输出结果:

接下来我们图解

图解说明:

1:先压棧。程序先运行main方法,根据棧的特点,main方法被压倒棧底。

在main方法中,int a =10 ; int b = 20; 所以①出输出的就是 a=10 b =20

2:接着change()方法进棧,然后经过运行完成之后,在change方法中 int a = 20 ;int b = 40了。所以在③处输出的a =20 b=4o

3:当棧内运行完成之后,就开始弹棧了。所以-,change方法先被弹棧。(可以理解为子弹已经出枪膛了)

4:接着main方法,所以②处输出的就是 main 方法中的a 和 b的值了。从图中我们可以看出,a = 10;b=20.所以在②处输出的是 10和20

二:地址值传递及图解

如下图:

思考:

①处应该输出的是2

②处(在changeArr方法里面的)输出的是多少?

③处输出的是多少?

分析:

因为 arr[i]%2==0 这句代码意思就是:arr中第i个元素如果模 2 == 0

才会执行arr[i]*=2这句代码的意思就是:arr[i]= arr[i]*2;

至于 模运算(%)是什么和arr[i]*=2是什么,可以回顾下之前文章。

所以②处输出的是4.

那么③应该是什么?

请看运行结果:

内存图解;

图解说明:

1:同样main函数先被压棧 到棧底

2:在堆区创建了arr数组并初始化了分别为1,2,3,4,5 所以在①输出arr第二个元素就是2

3:接着changeArr方法进棧

4:同样 将数组 arr的地址指想了changeArr方法,

5:经过changeArr方法运算之后,数组第二个元素就变成4 ,第四个元素变成8。所以在②打印出的是4

6:程序运行完成changeArr被弹棧(子弹出膛)。也就是引用arr数组的地址值被切断了。如图中被划断的

7:接着运行main方法,此时main方法中arr的地址值依然指向的是 0x0011这个。我们从堆区中可以看到,在堆区中的arr={1,4,3,8,5}

所以在③打印出arr中第二个元素就是4

三:总结

通过本节学习,我们需要掌握

1:Java中值传递和址传递的区别

值传递,值是多少,就是多少。

址传递,有可能会变化的。如果其他方法引用这个地址值之后,进行处理,那么就会影响最终结果。

下节预告:

下节开始我们将做个小项目:简单的《学生管理系统》,通过这个小项目,可以把之前学过的串联起来,一起回顾java基础语法。欢迎学习下一篇:《从零学java笔录-第37篇基础语法完结小项目练习-学生管理系统 基础版》

推荐阅读更多精彩内容