对象内存分析
JAVA中的内存区域可以分为栈空间和堆空间两块区域。
- 栈空间(虚拟机局域变量表):存放的是局部变量存放的是局部变量(包含编译期可知的各种基本数据类型、对象引⽤-即堆内存的地址,可以简单的理解为对象的名称), Java栈是与线程对应起来的,每当创建⼀个线程, JVM就会为这个线程创建⼀个对应的Java栈。
- 堆内存:保存的是真正的数据,即对象的属性信息。
用代码来看看这两个部分的内存。
class Person{
String name;
int age;
}
public class Test{
public static void main(String[] args) {
Person per = new Person();
per.name = "张三" ;
per.age = 18 ;
}
}
main方法中的第一行代码
Person per = new Person();
出现关键字new 就表明在堆上分配内存并且产生了person类的对象per引用了这部分内存。内存图如下:
接下来的两句代码:
per.name = "张三" ;
per.age = 18 ;
通过per引用设置堆中的属性值,内存图如下:
对象(引⽤数据类型)必须在实例化后调⽤,否则会产⽣ NullPointerException (运⾏时错误),编译时不会出错。
NullPointerException 在各位今后的开发⽣涯中会⼀直存在,只有引⽤类型(数组、类、接⼝)才会产⽣此类异常。以后出现此类异常,就根据出错位置查看引⽤类型变量是否初始化。