Java

类实例化时在内存中发生的变化

2022-10-21  本文已影响0人  小名源治

解析下面代码在内存中创建,执行,销毁的过程

public class People{
    String name; // 定义一个成员变量 name
    int age; // 成员变量 age
    Double height; // 成员变量 height
    void sing(){
        System.out.println("人的姓名:"+name);
        System.out.println("人的年龄:"+age);
        System.out.println("人的身高:"+height);
    }
    
    public static void main(String[] args) {
        String name; // 定义一个局部变量 name
        int age; // 局部变量 age
        Double height; // 局部变量 height
        
        People people = new People() ; //实例化对象people
        people.name = "张三" ;       //赋值
        people.age = 18;             //赋值
        people.stuid = 180.0 ;   //赋值
        people.sing();              //调用方法sing
    }
}

代码解析

1、在类加载阶段,将.java文件编译生成.class文件,其中包含person.class
,存放于方法区中。 person.class包含了该类的基本信息(string name ,int age ,Double height,void sing(),void mian())

image.png

2、程序执行到main方法的时候,main()函数方法体进栈,其中定义了一个指向Persion的变量persion

image.png

3、程序执行到 Person person = new Person(); 就会在堆内存开辟一块内存区间,用于存放 Person 实例对象,然后将成员变量和成员方法放在 new 实例中,都是取成员变量和成员方法的地址值

image.png

4、接下来对 person 对象进行赋值, person.name = “小二” ; perison.age = 13; person.height= 180.0;
先在栈区找到 person,然后根据地址值找到 new Person() 进行赋值操作。

image.png

5、当程序走到 sing() 方法时,先到栈区找到 person这个引用变量,然后根据该地址值在堆内存中找到 new Person() ,然后找到成员方法sing(),将sing()进栈,

在方法体void sing()被调用完成后,就会立刻马上从栈内弹出(出站 )

image.png

6、最后,在main()函数完成后,main()函数也会出栈

上一篇下一篇

猜你喜欢

热点阅读