Java面向对象内存分析详解(实例、图)通俗易懂

Java面向对象内存分析详解(实例)通俗易懂

在开始之前先了解一下【JAVA虚拟机运行时数据区域】

1. 一个对象的内存图解

Java面向对象内存分析详解(实例、图)通俗易懂_第1张图片
①、在运行main方法之前,方法区最先有数据,按照上述代码执行顺序,把类相关信息加载到方法区中
②、main方法开始进栈(也叫做压栈),执行 Phone one=new Phone(),把Phone one存到栈中(局部变量/引用),把new Phone()存到堆中(new 的对象/数组),那么new出来的对象内容去哪里找呢?
③、在我们创建对象的时候,我们从方法区找到成员变量、成员方法存放到堆中,然后我们在中把三个成员变量赋上初始值null、0.0、null,在中我们把成员方法赋个地址值为【0x333】(成员方法其实保存的是一个地址值),这时堆当中的成员方法是一个地址值指向了方法区。我们把new Phone()也赋个地址值为【0x666】。
④、那么我们在栈中就可以把【one】赋个地址值为【0x666】,我们在继续看代码,执行三行打印输出语句,根据地址【0x666】就可以找到这个对象,之前在堆中赋上了初始值null、0.0、null,所以打印出来的就是null、0.0、null,接下来在执行【one.brand=“苹果”】、【one.price=8388.0】、【one.color=“黑色”】,根据地址值在堆中重新赋值为【苹果】、【8388.0】、【黑色】改变了成员变量的值。
⑤、执行【one.call()】方法,首先通过one的地址值【0x666】在堆中找到成员方法,在通过成员方法的地址值【0x333】在方法区找到call()方法,call()方法要是运行,【call(String who)】方法就要进栈(也称压栈:先进后出),然后打印一句话,运行完后,call方法就会出栈,从内存中释放。main方法还没运行完,接下来在运行sendMessage()方法,同理运行完出栈,最后main方法运行完也要出栈,整个程序运行结束。

下面几种情况,结合代码和图可以自己试着分析。道理都大同小异。

2. 两个对象使用同一个方法的内存图解

Java面向对象内存分析详解(实例、图)通俗易懂_第2张图片

3. 两个引用指向同一个对象的内存图解

Java面向对象内存分析详解(实例、图)通俗易懂_第3张图片

4. 使用对象类型作为方法的参数内存图解

Java面向对象内存分析详解(实例、图)通俗易懂_第4张图片

5. 使用对象类型作为方法的返回值类型内存图解

Java面向对象内存分析详解(实例、图)通俗易懂_第5张图片

你可能感兴趣的:(JAVA,java)