Java中的内存分析
分析内存是深入了解编程的第一步,以下来演示一下编程中常见的内存分析,文章脉络:

数据类型
数据类型不同,内存分配位置和大小也不同,用一张图表示Java中的数据类型。除了基本数据类型,其它全部是引用类型

局部变量:方法体内声明的变量,包括形参都是局部变量方法体外。
成员变量:类内声明的变量为成员变量。
布局
以下一张图可以清楚的展示代码从提取到运行的的位置。

由图可以看出,执行步骤:
1、从硬盘中提取代码到内存中。
2、代码存放在代码段;局部变量和基本数据类型存放于栈;引用类型存放于堆中;静态变量、字符串存放于数据段。
一维数组
例如一维数组的初始化
在内存中是s指向了堆内的值:
如果数组的项是引用类型,如下
执行Date [] days;在栈中给days分配空间:
执行days= new Date[3];在堆中给days分配三个位置,内容为空,days指向这三个位置:
执行循环后,每个days项再指向堆中分配的时间位置:
二维数组
二维数组可以看成以数组为元素的数组。例如:
int a[][]={{1,2},{3,4,5,6},{7,8,9}};
内存回收
栈里面的内存,函数执行完后消失,而堆里面的内存,需要垃圾回收机制回收,不一定马上消失。
实参与局部变量同等对待;函数返回值也会在栈里面临时存放,函数就执行完也就会删除,调用完毕后内存回收,但是只分配空间,没有名字。
构造函数
在栈中分配一个空间为tom,用于new出对象:
构造函数中的值也放到栈中:
执行new时
把栈中的值赋给堆中new出来的tom对象:
执行完毕后,方法中的局部变量在栈中所占空间被收回。
this指针
我们都知道this指向的是对象本身,以下这张图可以形象的看出,this是如何指向自身:
static变量
静态变量,分配空间时,位于的是数据段,而并非堆和栈中。
super关键字
继承
实现接口内存分析
New出来的Student("le"),应该有sing();sleep();study();getName(),但是由于定义的是Singer S1,所以s1只能访问New出来的Student中的sing和sleep方法。
以前看设计模式,对Interface xx=new Object();及类似的语句理解非常模糊,类似这样的问题内存分析可以更直观的展示出其原理。本文简单介绍了函数、类、对象的内存分析,掌握这些可以更深刻的掌握面向对象常见的继承、实现、构造、多态等。