2017-10-31课堂作业02

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;

总结一下:如果方法中传入的是基本数据类型,那么原变量的值是不会发生改变的,如果方法中传入的是引用数据类型(即类类型),那么传入方法中,如果对对象的相关属性进行了修改,那么原对象的相关属性也会发生改变。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章