欢迎使用CSDN-markdown编辑器

来源:互联网 发布:传奇 放技能 编程 编辑:程序博客网 时间:2024/06/07 09:13

java 复习Day_01 内存分析

java内存分析,在Java中的传递都是值传递。

我们在这之前要明白一个概念就是内存分为三部分,分别为栈内存,堆内存和方法区1.栈内存  是快速连续的存储空间,必须存放一直大小,知道生命周期,一般存放基本数据类型的数据2.堆内存  是链式结构,灵活的控制内存的分配3.方法区 存放类的字节码文件,静态变量 ,字符串变量 

首先,分析一下基本数据类型的值传递方式。

    public static void main(String[] args){        int a=5;        int b=10;        change(a,b);    }    public static void change(int a,int b){        int c=a;        a=b;        b=c;    }
先运行main里面的函数,将a,b赋值,然后进入change函数,在函数里面运行了一下数字转换, change方法会在堆内存里面创建一个空间存放方法里面使用到的变量,mian函数里面的变量是放在占内存里面的,所以当change方法里面的变量发生改变的时候,并不会改变栈内存里面的变量的值,所以输出的还是10和5。下面是方法运行的图:

内存分析图
上面是基本数据类型的值传递 现在我们分析一下引用类型的值传递

class Date {    int year;    int month;    int day;    public void show() {        System.out.println("Date.show(今天是" + year + "-" + month + "-" + day + ")");    }}public static void main(String[] args){    Date d1=new Date();    change01(d1)    d1.show();}public static void change01(Date date){    date.year=6000;}

在这里定义了一个date类,在main方法里面new了一个新的实例d1,这个d1是存放在栈内存里面的,然而在类会在堆内存里面创建一个空间,存放类的字段和方法,d1在栈里面存放的是堆内存新建那个空间的地址,所以当year改变的是改地址里面的year 所以里面的值会变化。输出的是6000 下面是内存分析图
内存分析图

下面我们有定义了一个方法change02()

public static void change02(Date date,int num){    date.year=2016;    num=100000;}

我们如果调用这个方法 看看这个num输出的是多少,我们来看看 内存分析图,再来判断。

内存分析图

通过图片我们可以看出,方法里面改变的num的值 是堆内存里面的num 栈内存里面的num值并没有改变,所以输出的还是110 如果在末尾加上return 则会把堆内存里面的num返回到栈内存里面 那个时候输出的num就是10000

我们在定义一个方法change03()

public static void change03(Date date) {        date = new Date();        date.year = 3000;    }

在这个方法里面, 传入一个参数,然后在方法里面对这个参数重新生成了一下实例, 这个时候date的地址就会发生改变, 下面改变的year的值是新创建这个date里面的。所以输出的话,d1的year还是0,没有定义。
下面看我的内存分析图

这里写图片描述

0 0
原创粉丝点击