欢迎使用CSDN-markdown编辑器
2016-07-26 19:42
357 查看
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,没有定义。
下面看我的内存分析图
相关文章推荐
- 主流PHP框架之间的比较
- Hdu1248 寒冰王座
- 234. Palindrome Linked List
- css 定位介绍
- ObjectAnimator之android:propertyName
- 基于UAAG2.0 Reference的移动无障碍案例(一)
- c/c++第二天
- JAVA以UTF-8导出CSV文件,用excel打开产生乱码的解决方法
- 服务化拆分
- 绘图基础二
- 常用 web service
- HDU 5752 Sqrt Bo
- 常见的路由表建立算法
- 每日练习
- 服务化拆分
- 服务化拆分
- HDU 5514 Frogs (容斥原理)
- [SCU4439] Vertex Cover [2015 Sichuan Province Contest Final D]
- Android 开发环境目录结构
- 树莓派 Learning 001 装机 ---之 1 安装NOOBS系统