概念
- 栈区(stack):由系统的编译器自动的释放,主要用来存放 方法中的参数,一些临时的局部变量 等,并且方法中的参数一般在操作完后,会由编译器自动的释放掉。
- 堆区(heap):由程序员决定,在Java中,如果程序员不释放的话,一般会由垃圾回收机制自动的清理掉。此区域主要存放: 创建的对象、动态申请的临时空间等 。
- 数据区(data seg):也称 全局区或者静态区 ,存放 静态变量、全局变量等 都会存放到数据区,此区域上的东西都被全局所共享。比如我们通常采用 类名. 的方式就可以访问到方法,这就是所谓的静态方法,存放到数据区的。
- 代码区:存放程序编译后可以执行代码的地方。比如执行代码时写的While语句、if语句等,都会存放到此。
内存分析
1
2
3
4
5
6
7
8
9// Person类
class Person {
int id ;
int age = 20 ;
Person(int _id, int _age){
id = _id ;
age = _age ;
}
}
接下来对new一个对象进行分析
执行语句: Person tom = new Person(1,25) ;
第一步:
我们知道每一个类都有一个默认的构造函数,即Person(),因此上述会先调用默认的构造函数
第二步:
执行构造函数New Person(1,25)时,我们知道调用的是Person(int _id, int _age),所以此时栈空间会分配方法的参数的临时变量如下
第三步:
执行构造函数 Person(int _id, int _age),id = _id; age = _age;此时栈中的临时变量会改变默认构造函数创建的对象,赋值完后,栈中的临时变量会自动的销毁,然后创建的临时变量Tom会自动的指向创建的对象。