Java栈,堆和方法区

Java栈,堆和方法区


内存管理:都是有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字节码文件(包括静态变量和所有方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值