内存管理:都是有jvm来管理的,我们控制不了
堆:
- 只有new出来的实例对象加上成员变量
- 成员变量一定是在堆中
- 方法外面的属于成员变量
- 数组也是一个对象,所以数组对象也存储在堆中,将数组的元素当作成员变量一并存储在堆中
栈:
- 局部变量(包括方法的参数)一定是在栈中
- main里面的变量属于局部变量
- 栈里面存着的是:
- 引用类型的地址
- 基本类型的值
例子:
class Aoo{
Student zs;//堆,因为是成员变量 引用变量存的是地址
int a;//堆,因为是成员变量 基本类型存的是值
void test(){
Student a;//栈,引用变量存的是地址
int y;//栈,引用对象存的是数
}
}
堆和栈的例子
举个例子
例子:
Bomb b1 =new Bomb(100,200)
逻辑是显示new了一个实例对象,在堆中开辟了一个空间储存bomb对象,里面的参数:x=100,y=200,
因为b1在main方法中,属于局部变量,并且Bomb属于引用对象,所以也会在栈中会开辟一个b1的空间存储b1的地址并指向堆
假设我们要提取b1.x,那我们先找到栈中的b1地址,然后再找到堆中的对象
如果想修改b的值,先找b1找到了地址,基于地址找到了堆中的对象的第一个元素,就可以依次找到后面的元素,再做修改。
例子:
int a = 5
因为没有new所以不能在堆里开辟空间,int a是基本类型,在栈中储存数
如果想改 a,那么先在栈中找到a,然后再修改值
bs[0]是一个Bomb对象数组,原来默认值是null,里面装的是Bomb对象的地址(因为有new,所以新建了一个BOMB对象),需要改值的时候,先找到栈里面的bs,通过地址找到堆里面的第一元素,因为元素里面保存着地址,再通过地址指向保存的类。
有趣的扩展:
如果这个时候我们把变量的值变为null(空),这个时候他会删掉堆和栈里面的值,也就是栈里面的地址会删掉,对象里面的成员变量也都会删掉,你在给他赋值会报错叫NullPointerException(空指针异常)
null的总结:
null:表示空,没有指向任何对象,若引用的值为null,则该引用不能进行任何点操作>了,若操作则发生NullPointerExceptionp空指针异常
- 引用数据类型可以赋值位null,引用数据类型也是数据类型
- 引用类型的默认值都是null,引用类型赋值要new一下
Bomb[] bs = new Bomb[10];//数组
bs[0]=new Bomb();//给元素赋值需要new一个对象,调一个类
bs=new Bomb();
- 基本数据类型不可以赋值为null
方法区
存:class字节码文件(包括静态变量和所有方法)