之前的《java基础:内存模型》当中,我们大体了解了在java当中,不同类型的信息,都存放于java当中哪个部位当中,那么有了对于堆、栈、方法区、的基本理解以后,今天我们来好好剖析一下,java当中的类加载机制(其实就是在美团的二面的时候,被面试官问的懵逼了,特地来总结一下,免得下次再那么丢人 T-T)。
我们都知道,在java语言当中,猴子们写的程序,都会首先被编译器编译成为.class文件(又称字节码文件),而这个.class文件(字节码文件)中描述了类的各种信息,字节码文件格式主要分为两部分:常量池和方法字节码。那么java的编译器生成了这些.class文件之后,又是怎么将它们加载到虚拟机当中的呢?接下来我们就好好讨论一下这个事情。
参考连接:http://www.cnblogs.com/xrq730/p/4844915.html (感觉这个博主写的很适合greenHand看,所以就参考着自己总结了一份)
类的生命周期:
首先我们来看看,在java当中一个类的完整的生命周期,主要包括了以下七个部分:1.加载、2.验证、3.准备、4.解析、5.初始化、6.使用、7.卸载。在这7个阶段当中,前5个阶段加起来,就是类加载的全
过程,如图所示。而验证、准备、解析,三个阶段又可以被称为连接阶段。除此之外,类加载过程当中的五个阶段,除了解析阶段,其他都是顺序开始的,但不是顺序执行的,也就是说在过程当中是可以并行的,比如在验证开始后,还未结束,可能就会开始准备阶段。而解析阶段不一定在这个顺序当中的原因是因为,它在某些情况下可以初始化阶段之后在开始,这是为了支持Java语言的运行时绑定(也称为动态绑定)。
注意:这里出现了一个新概念,叫绑定,简单解释了一下什么叫绑定吧,在java当中的绑定定义为:指的是把一个方法的调用与方法所在的类(方法主体)关联起来,主要分为了静态绑定和动态绑定。
静态绑定:即在程序执行方法之前就已经被绑定,简单来说再编译期就进行绑定,在java当中被final、static、private修饰的方法,以及构造方法都是属于静态绑定,即编译期绑定。
动态绑定:又称运行时绑定,在运行时根据具体对象的类型进行绑定,在java当中,几乎除了满足静态绑定的方法之外,所有方法都是动态绑定的(java当中运行时多态的重要实现根据)