面向对象06:创建对象内存分析
面向对象06:创建对象内存分析
创建对象
创建一个Pet类,实例化两个对象。
package com.oop.demo03;
public class Pet {
public String name;
public int age;
public void shout(){
System.out.println("叫了一声");
}
}
package com.oop;
import com.oop.demo03.Pet;
public class Application {
public static void main(String[] args) {
Pet dog = new Pet();
dog.name = "旺财";
dog.age = 3;
dog.shout();
System.out.println(dog.name);
System.out.println(dog.age);
Pet cat = new Pet();
}
}
创建对象内存分析
名词解释
- 栈:主要用于存储main(),引用变量名等
- 堆:存储对象
- 方法区:加载类相关信息
- 静态方法区:和类一起加载的,可以被对象直接使用
流程图

流程分析
- 程序开始运行时,首先会加载一些关于
Application类的模板信息,该Application类里含有
- main()方法
- 常量池:旺财
- 执行
main方法,会遇到Pet类,加载Pet类,内含
-
name
-
age
-
shout()
此时
name,age值都为null
main方法遇到new Pet,创建对象。
- 栈内存会为
dog,cat引用开辟空间。 - 堆内存会为
dog,cat开辟空间,此时堆内存中的dog,cat对象的成员变量被默认初始化。 dog对象里的name值调用了常量池的"旺财"字符串,调用了Pet类里的shout()方法,完成自定义初始化。- 通过构造方法完成对象初始化完毕。
- 将
dog引用指向dog对象的内存,cat引用指向cat对象的内存。
总结
- 在程序运行时,主方法所在的类
Application首先在方法区内被加载,主方法里调用了Pet类,于是方法区继续加再出Pet类。 - 使用
new关键字创建dog对象时,Pet类生成了一个名为dog的引用类型,栈内存被开辟了一片空间用于其存储,该引用类型不存储任何东西,只存储一个指向对象的地址。 - 该引用类型存储指向对象的地址,并且在堆内存中开辟一片空间,即该引用类型在堆内存中加载出一个对象,此时对象的成员方法得到加载,对象的变量如
String,int都为默认值,即完成默认初始化。 - 方法区中
Pet中常量池里的值被传给对象,对象完成自定义初始化。 cat同理。

浙公网安备 33010602011771号