java内存分析(4)new一个对象,底层做了哪些事情

创建对象过程

我们知道:程序运行最开始,编译器会将.java文件编译为.class文件

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Animal {
public String name = "lion";
public int age = 5555;

public void eat() {
System.out.println("Lion is eating!");
}
}

class Test {
public static void main(String[] args) {
Animal animal1 = new Animal();
Animal animal2 = new Animal();

System.out.println(animal1.name == animal2.name); //true

}
}

image-20211023144946776

对上面new一个对象(以Animal类为例)流程解释如下(辅助图中解释一块看):

  1. 当需要new一个Animal对象时,首先看方法区中,有无Animal.class的模板:
  2. new一个对象,将对象存放在堆中
  3. 是否需要一个该对象的引用变量。如果需要,就在栈的栈顶生成一个该对象的引用变量

注意:

①上面的Animal1和Animal2由于是局部变量,所以存储在栈中;

②而name、age是成员变量,所以跟随着对象存储在堆中

扩展

在上面的例子中,我们还涉及到了常量池的概念,有关常量池的概念,见博客:java中常量池的理解

Contents
  1. 1. 创建对象过程
    1. 1.1. 举例:
    2. 1.2. 扩展
|