我们从两块最常用的内存空间对对象创建进行内存分析
- 堆内存:存放的是对象的具体信息;在程序之中堆内存空间的开辟是通过new完成的
- 栈内存:存放的是对象的地址信息,即通过地址找到堆内存进而找到对象内容,但是为了简化起见,简单理解将对象的名称保存在栈内存中
堆内存内每一块内存都有着一个专属的地址编号,而栈内存则存放这个地址编号
图解如下:
我们来分析一个创建对象的案例
public class test {
public static void main(String[] args) {
Students stu = new Students();
stu.name="工地佬";
stu.age=18;
}
}
内存图解:
第一步:Students stu = new Students();
new:在堆内存中开辟新的空间;
Students:定义了对象的信息;存放于所开辟的空间里
stu:对象的名称;存放于栈内存中,实则存放的是新空间的地址信息
第二步:stu.name="工地佬";
第三步:stu.age=18;
对象化的实例化有两种语法:
- 使用声明并实例化:Student stu=new Students();
- 分步完成:① 声明对象Student stu=null; ② 实例化对象 stu=new Students();
分步完成实例化的内存分析:
第一步:Student stu=null;
第二步:stu=new Students();
注意:
- 如果代码中只声明了对象,没有实例化,则无法调用。而此时会报错指向异常(NullPointerException),意为没有在辟堆内存开辟空间,即没有new,此异常只有在引用数据类型存在此问题。