一、Load:装入类有关信息存入method area(finding and importing the binary data for a type)
1、常量池(the constant pool for the type)
1》按照类中使用常量的顺序存放常量信息(如string,integer,常量)
2》类、成员、方法 的symbolic references 。
*如果别的类使用此类的常量,哪么就复制一份,放入自己的常量池中。
类常量,类变量,都存入method area。
2、类成员(field)信息成员名字,类型,修饰(public,private...)
3、方法信息:1》名字,返回类型(or void),参数的类型和个数,方法的(public,private...)
2》方法的字节码,操作堆栈的大小,本地变量区。
4、类变量Class Variables(类级别)
所有对象共享,当对象没建立(new)时也可以用,
存入方法区中,属于类数据,类数据使用之前,必须从method area 分配内存。
5、A reference of class Class:通过reference 和 类对象连接,就可以取类运行时method area 存贮的信息。
类对象:java.lang.Class 建立(new)每个装入的内存的.class文件 对象,变成Class的对象。
1>Class p=Class.forName("ftypeinfo.toys.Person");//得到一个类 reference
2>Person p1= new Person();
Class p=p1.getClass();://java.lang.Object 有 getClass 方法。
二、Link
1、Prepare:为类变量分配内存,初始化内存默认值( allocating memory for class variables and initializing the memory to default values)
2、Resolve:
三、initialize:初始化类变量值(invoking Java code that initializes class variables to their proper starting values.)
主要两步:
1、初始化父类(如果有且父类未初始化)。
2、执行类的类初始化方法(初始化类变量和static块)
类初始化方法(<clinit ()):就是由编译器把类里面的类变量初始化和static 初始化统一放入一个<clinit 方法里