Java起航 ---- 类的初始化历程
?????? 既然谈到类的初始化,那就不得不把VM(Virtual Machine,虚拟机)先做个简单的介绍...
????? VM,是Java程序运行的核心。它是不可视的,也就是说你在你的机器上根本找不到它。那么它到底是怎么产生的呢?其实它只是一个dll格式文件(全称是jvm.dll,该文件隐藏在jre目录下)。初始化VM的过程:java命令解释*.class文件时 ----> 通过环境变量找到JRE目录并产生JRE ----> 在JRE目录下,寻找jvm.dll文件,并初始化一个jvm (VM的更详细介绍请自行下载观看JVM工作原理)
?
??????当我们需要运行一个类时,过程且看图片“类的生命周期”。 本文只着重介绍到“初始化”一步,并尽可能的用代码证明得出的结论。???? 重申:类的连接分为验证、准备、解析

?
????? 1、装载
???????????也称类的加载。它是指将类的class文件(本地磁盘或者网络上)加载至VM内存中,并为之创建一个对应的java.lang.Class对象。(这部分内容本人正在消化中,代码消化完贴出...)2011.5.29 补上
????????
???????????加载类的加载器有三种:
?????????? 1、Bootstrap ClassLoader:根类加载器,也称引导类加载器。它是VM自动实现的,代码是用c语言实现的,所以你在IDE中是找不到它的源代码滴。??它负责加载jdk中的系统类,加载Java的核心类如String。
?
?????????? 2、Extension ClassLoader:扩展类加载器。它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统指定的目录)中JAR的类包。
???????
?????????? 3、System ClassLoader:系统类加载器。它负责在JVM启动时,加载来自命令java -classpath或者java.class.path系统属性,或CLASSPATH环境变量所指定的JAR包和类路径。一般都认为系统类加载器是加载应用程序第一个类的加载器
?????????
???????????代码如下
?
package com.ClassTests;/************************************************** * * @author: 叻ハ. * @create-time: 2011-5-21 下午01:27:04 * @revision: 1.0 * @purpose: 简析类的生命周期及类的初始化 * ***************************************************//************************************************** * * @author: 叻ハ. * @create-time: 2011-5-21 下午02:25:46 * @revision: 1.0 * @purpose: 类的实例化 * ***************************************************/class Parents{public Parents(){System.out.println("---此时调用了子类的构造方法,父类的初始化开始...");}}public class ClassLife extends Parents {private static int c;public ClassLife(){//super(); //有无super()结果一致,说明程序默认优先初始化直接父类,然后再子类。如果需要显示调用,super()必须放在第一句System.out.println("---此时调用了子类构造方法,子类的初始化开始...");}// 静态初始化块static {System.out.println("---执行了类的初始化...");System.out.println(c);}// 初始化块{System.out.println("---执行了对象的初始化块...");// 问题1: 为什么没有声明b,而可以使用4。b = 4; }int b;public static void main(String[] args) {ClassLife cl = new ClassLife();System.out.println(cl.b); // 对象属性的初始化与类的属性初始化一致}}???? ????? 运行结果:---执行了类的初始化...
???????????????????? ---此时调用了子类的构造方法,父类的初始化开始...
?????????????????????---执行了对象的初始化块...
???????????????????? ---此时调用了子类构造方法,子类的初始化开始...
???????????????????? 4
???
??????? 分? 析 : 认真看上面的类的初始化
????
?
?????
?????
?????最后归纳下对象创建过程发生的事:
?????? 给类的属性在分配内存 ----> 初始化类的属性? ---->? 给对象属性分配内存 ---->? 在初始块中初始化对象属性? ---->如果有父类,优先构造初始化父类? ---->?? 调用子类的构造器,创建对象。
??????
?
?
?
??