以以下代码为例来分析Java中一个对象的内存图。
public class Demo1_car {
public static void main(String args[])
{
Car c1=new Car();//创建对象
//调用属性
c1.color="red";
c1.num=8;
c1.run();
}
}
/*
车的属性:颜色,轮胎数目
车的行为:运行
*/
class Car{
String color;
int num;
public void run()
{
System.out.println(color+"……"+num);
}
}
这里就涉及到了方法区的知识点。方法区的定义百度上都有,这里就做简单的介绍。方法区,即代码仓库。代码编译时,源文件变为字节码文件,而字节码文件本来是放在硬盘上的;运行之后,字节码文件就要进入内存,即进入了方法区。
1、编译运行的是Demo1_car,所以Demo_car.class先进入方法区;
2、虚拟机调用main方法,让main方法进栈;
3、main方法进栈后,使用Car 创建对象,所以要现在内存中加载Car.class文件,Car.class文件有对应的成员变量和成员方法。
4、有了Car.class文件后创建对象Car c1;
5、new出来的对象需要进入堆中,其成员变量有系统给出的对应的初始值;
6、然后将堆中的地址赋值给c1,c1通过地址可以找到该类所在的地方;
7、下面就是对成员变量进行赋值;
8、下面调用run方法,run方法进栈;
9、run方法调用结束后,弹栈
最后,如果将c1=null然后调用run()会如何呢?会出现空指针异常,因为c1将不再指向对象。如果没有任何引用指向该对象 ,那么该对象就会变成垃圾,java中有完善的垃圾回收机制,会不定时对其进行回收。