读书人

Java起飞 - 类的初始化历程

发布时间: 2012-12-28 10:29:04 作者: rapoo

Java起航 ---- 类的初始化历程

?????? 既然谈到类的初始化,那就不得不把VM(Virtual Machine,虚拟机)先做个简单的介绍...

????? VM,是Java程序运行的核心。它是不可视的,也就是说你在你的机器上根本找不到它。那么它到底是怎么产生的呢?其实它只是一个dll格式文件(全称是jvm.dll,该文件隐藏在jre目录下)。初始化VM的过程:java命令解释*.class文件时 ----> 通过环境变量找到JRE目录并产生JRE ----> 在JRE目录下,寻找jvm.dll文件,并初始化一个jvm (VM的更详细介绍请自行下载观看JVM工作原理)

?

??????当我们需要运行一个类时,过程且看图片“类的生命周期”。 本文只着重介绍到“初始化”一步,并尽可能的用代码证明得出的结论。???? 重申:类的连接分为验证、准备、解析

Java起飞 -  类的初始化历程

?

????? 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

???

??????? 分? 析 : 认真看上面的类的初始化

????

?

?????

?????

?????最后归纳下对象创建过程发生的事:

?????? 给类的属性在分配内存 ----> 初始化类的属性? ---->? 给对象属性分配内存 ---->? 在初始块中初始化对象属性? ---->如果有父类,优先构造初始化父类? ---->?? 调用子类的构造器,创建对象。

??????

?

?

?

??

读书人网 >编程

热点推荐