一、内存分类
栈内存、堆内存、方法区、本地方法栈(涉及与其他语言的交互)、寄存器
二、栈内存
可以用于存储变量,栈内存对存入其中的变量不会自动赋值,变量在使用完成之后会立即移
三、堆内存
用于存储对象的,堆内存对于存入其中的元素会自动的赋予初始值
byte/short/int-0,long-0L;float-0.0f,double-0.0,char-‘\u0000’(注意单引号),boolean-false, 引用数据类型的默认值都是null
对象使用完成之后不会立即移出堆内存,而是在不定的某个时刻被回收
声明的时候,是在栈里面开辟空间存放这个变量。 碰见new,就立即在堆中开辟空间,该内存有个地址,将地址放在栈里面。此时栈中的变量的值就是堆中内存的地址。根据栈中存放的地址找到堆中开辟的空间。如果是数组,将该空间平均分成若干份(数组定义的时候确定的大小是几就平均分成几份。) |
内存的初始化过程在程序的初始化之前。在内存初始化的时候,并不知道具体值是多少,所以此时都是默认值。内存初始化完成之后才会赋值具体的值。 |
打印数组的时候(在代码中写的是打印数组定义的时候的数组名System.out.println(arr)),是从栈中取的变量的值,所以取出的是个地址(形式如下图所示)。当给定下标的时候,就可以顺着地址找到对应的值。 |