JAVA变量、栈和堆

学JAVA先得学JAVA的变量

1.根据声明方式的不同,java变量共有7种
--类变量:声明在class内,method之外并且用static 修饰
--实例变量:声明在class内,method之外并且没有用static修饰
--方法参数:声明在method小括号内的变量
--狭义的局部变量:声明在method内的变量
--异常捕捉参数:声明在catch小括号内的变量
--构造方法参数:声明在constructor(构造器)小括号内的变量
--数组元素:数组的元素没有识别名称,必须透过数组和索引值来识别

2.根据变量内存分类,java变量有两种
堆变量:占用的内存在堆中,这类变量包括类变量,实例变量,数组变量,这类变量会自动被JVM初始化默认值

stack variable:通称广义的局部变量,其占用的内存在statck(栈)中,这类变量包括狭义的局部变量、方法参数、异常捕捉参数、构造方法参数。狭义的局部变量不会被Jvm初始化成默认值,使用者必须自行初始化该变量,其余的会被jvm初始化成传入值

再来搞明白什么是堆什么是栈

在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分

Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区,启动时在自己的内存区域中进行更细致的划分,因为虚拟机中每一片内存处理的方式都不同,所以要单独进行管理
JVM内存的划分有五片:
1.寄存区
2.本地方法区
3.方法区
4.栈内存
5.堆内存
栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能机芯局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。占内存的更新速度很快,因为局部变量的生命周期都很短
堆内存:存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据小时,这个实体也没有小时,还可以用,所有堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,java有垃圾回收机制不定时地收取

	通过图例详细讲一下堆和栈:
	比如主函数中的语句 int [] arr= new int [3];在内存中是怎么被定义的:
	主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值

在这里插入图片描述
主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值,但是右边不是一个具体值,是一个实体。实体创建在堆里,在堆里首先通过一个New关键字开辟一个空间,内存在存储数据的时候都是通过地址来实现的,地址是一块连续的二级制,然后给这个实体分配一个内存地址。数组都是有一个索引,数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化(这是内存的特点,未初始化的数据是不能用的,但是在堆里是可以用的,因为初始化过了,但是在栈里没有),不同的类型初始化的值不一样。所以堆和栈里就创建了变量和实体。

所以堆和栈的区别很明显:
1.栈内存存储的是局部变量二堆内存存储的是实体
2.栈内存的更新速度快与堆内存,因为局部变量的生命周期很短
3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值