您的位置:首页 > 其它

欢迎使用CSDN-markdown编辑器

2016-07-26 19:43 267 查看

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,没有定义。

下面看我的内存分析图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: