2017-10-31课堂作业02
2017-10-31 18:15
204 查看
2017-10-31课堂作业02
解释参数在方法中的传递过程,并通过内存解析图的方式,描绘出方法执行时内存的变化。参数的传递都是「值传递」,在调用方法的时候,参数会被创造出一个副本,原本的值是不会改变的。
基本数据类型,也称为「值类型」
基本数据类型的值传递
class Test { //写一个方法用于计算两个值都加5 public static void fun1(int i, int j) { i = i + 5; j = j + 5; System.out.println("方法内输出" + i); System.out.println("方法内输出" + j); } public static void main(String[] args) { int a = 10; int b = 20; System.out.println("调用方法前a的值:" + a); System.out.println("调用方法前b的值:" + b); fun1(a,b); System.out.println("调用方法后a的值:" + a); System.out.println("调用方法后b的值:" + b); } }
最后输出结果:
调用方法前a的值:10
调用方法前b的值:20
方法内输出:15
方法内输出:25
调用方法后a的值:10
调用方法后b的值:20
下边通过内存模型来分析一下。
1、main()方法顺序执行,当执行了int a =10; b = 20;这两句代码后,程序在栈内存中开辟了两个空间,里边分别存放的值是10,20,内存模型如下图:
2、执行输出语句,此时输出的a =10 ,b = 20;
System.out.println("调用方法前a的值:" + a); System.out.println("调用方法前b的值:" + b);
3、执行方法fun1(),程序在栈内存中又开辟了两块块空间,分别存放a,b的副本a’与b‘,将a ,b 的值传递过去,执行a’= a’ + 5 , b’ = b’+5,输出a’,b’。内存模型如下图:
fun1(a,b);
a , b 的值与 a’ 和 b’ 的值没有关联,不会受其影响。所以运行方法后再输出a,b的值时,其没有发生变化,仍然是10与20。
引用类型的值传递
class P { int a; int b; } class Test1 { public static void fun1(P p) { p.a = p.a + 5; p.b = p.b + 5; System.out.println("方法内输出:" + p.a); System.out.println("方法内输出:" + p.b); } public static void main(String[] args) { P p = new P(); p.a = 10; p.b = 20; System.out.println("调用方法前p.a的值:" + p.a); System.out.println("调用方法前p.b的值:" + p.b); fun1(p); System.out.println("调用方法后p.a的值:" + p.a); System.out.println("调用方法后p.b的值:" + p.b); } }
最后的输出结果:
调用方法前p.a的值:10
调用方法前p.b的值:20
方法内输出:15
方法内输出:25
调用方法后p.a的值:15
调用方法后p.b的值:25
下边通过内存模型来分析一下。
1、首先定义一个类P,作为引用类型来使用。
2、main()方法顺序执行,执行P p = new P();时,内存空间发生了如下事件
执行 p.a = 10; p.b = 20; 内存空间发生如下事件
执行输出语句,此时输出的p.a =10 ,p.b = 20;
3、执行方法fun1(),程序在栈内存中又开辟了新空间,用于存放p的副本p’,将p的值0x0001传递过去,此时p与p’都指向栈区的0x0001
执行
p'.a = p'.a + 5; p'.b = p'.b + 5;
执行
System.out.println("方法内输出:" + p.a); System.out.println("方法内输出:" + p.b);
输出p’.a = 15 ;p’.b = 25;
4、再次执行
System.out.println("调用方法后p.a的值:" + p.a); System.out.println("调用方法后p.b的值:" + p.b);
由于p也是指向0x0001,堆内存中的值已经改变,所以此时输出p.a = 15; p.b=25;
总结一下:如果方法中传入的是基本数据类型,那么原变量的值是不会发生改变的,如果方法中传入的是引用数据类型(即类类型),那么传入方法中,如果对对象的相关属性进行了修改,那么原对象的相关属性也会发生改变。
相关文章推荐
- 2017-10-31课堂作业
- 2017-10-31课堂作业01
- 20171031|课堂作业02 方法参数相关博文
- 课堂作业02-20
- 课堂作业02-20
- C++课堂作业_02_PAT1025.反转链表
- 【C#基础】【语法02】课堂作业题 01-08
- 课堂作业02——读架构漫谈后感
- 第三次作业_02效能分析
- java课堂作业(二)
- 吴恩达deeplearning.ai课堂作业:Class 1 week2-Logistic Regression with a Neural Network mindset
- 操作系统作业02
- 课堂作业:查找字符串位置
- 课堂作业
- 软件工程课堂作业(十一)——NABC分析
- 课堂作业:电梯调度
- 第六周作业总结(内含查找排序课堂测试及课下作业报告)
- 课堂作业
- c++ 课堂作业(1)
- #11.21课堂笔记、作业以及学习心得