Java 一个对象的内存图

在这里插入图片描述
分析:
用到了三个内存块(栈,堆,方法区)
1.先在方法区中 储存.class相关数据,Phone.class 与 Demo01PhoneOne.class 文件 谁有main方法先执行谁

2.main方法进栈(压栈) 第一行代码是创建一个对象,等号左边是一个局部变量,把局部变量放入栈中(局部变量保存一些内容)

3.等号右边是new Phone() ,创建了一个对象,Phone类型的对象。 所有new的东西都在堆中,所以在堆中开辟一块空间

4.Phone类 的内容在方法区中存着。把成员变量参考着从方法区中拿到堆里(之前开辟的空间中),并给成员变量赋予默认值null等
5.堆中的成员方法存储的是成员方法在方法区中的地址,指向方法区中的成员方法。
6.堆中Phone整体也有一个地址, 第一行代码是 Phone one = new Phone(); 其实是把堆中new出Phone的地址赋予栈中的 Phone one 局部变量。(栈中根据地址就能找到堆中的对象)
7.访问one.brand. 在栈中找到存放的地址(在堆中的地址),就找到了堆中的默认值nll啥的。
8.one.brang=“苹果”; 根据one找到堆中的地址,再找brand,找到后把默认值null改为苹果。
9.one.call(“乔布斯”); 这是一个成员方法。 先在栈中找到堆中开辟的空间的地址。找到堆中的成员方法(这里面存放的是成员方法在方法区中的地址)
10.在方法区中找到call(String who)方法。 然后把call(String who)方法调入栈中运行,并在栈中开辟一块空间。
11.这个成员方法中的内容是 “给who打电话” ,调用的时候参数是乔布斯,所以是给乔布斯打电话。 这是根据方法调用而来的,调用的是call,所以就“运行”call。
12.call方法做完之后,就会弹栈(从栈内存中消失) 下一步是one.sendMassage()方法(和call方法一样)。运行完之后也让它出栈。
13.都运行完之后main方法也就出栈了,栈中所有的内存就没了,程序运行停止

这就是整个过程中内存中的变化。

猜你喜欢

转载自blog.csdn.net/weixin_45511599/article/details/108555078