您的位置:首页 > 其它

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;

总结一下:如果方法中传入的是基本数据类型,那么原变量的值是不会发生改变的,如果方法中传入的是引用数据类型(即类类型),那么传入方法中,如果对对象的相关属性进行了修改,那么原对象的相关属性也会发生改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: