黑马程序员技术交流社区

标题: 【上海校区】【Java中类的加载和执行过程】 [打印本页]

作者: 不二晨    时间: 2018-7-10 11:15
标题: 【上海校区】【Java中类的加载和执行过程】

Java中类的加载过程,总是搞不清楚,所以今天将所有的想法整理下来,认真分析一下。  (最后更新日期 2018/07/06 15:28)

学习的目标: 分清楚 加载 和 初始化,以及明确 类的加载 和 程序的执行顺序。


目前,多数内容来源于: (沙中世界)https://www.cnblogs.com/tengpan-cn/p/5869099.html


1. 一道阿里的笔试题解析:


2. 个人的理解:

首先,我们得理解 类什么时候加载,和 类什么时候初始化。



2.1 类什么时候加载

类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式[eagerly load](只要有其它类引用了它就加载)加载类,也可以是懒加载    [lazy load](等到类初始化发生的时候才加载)。不过我相信这跟不同的JVM实现有关。

然而他又是受JLS保证的(当有静态初始化需求的时候才被加载)。


2.1.2 类的加载顺序:

① 父类静态块--子类静态块--父类初始化块--父类构造方法--子类初始化块--子类构造方法

② 静态块---main()---初始化构造块-----构造方法(简化版)



2.2 类什么时候初始化

加载完类后,类的初始化就会发生,意味着它会初始化所有类静态成员,以下情况一个类被初始化:

反射同样可以使类初始化,比如java.lang.reflect包下面的某些方法,JLS严格的说明:一个类不会被任何除以上之外的原因初始化。



2.3.1  类是如何被初始化的

现在我们知道什么时候触发类的初始化了,他精确地写在Java语言规范中。但了解清楚 域(fields,静态的还是非静态的)、块(block静态的还是非静态的)、不同类(子类和超类)和不同的接口(子接口,实现类和超接口)的初始化顺序也很重要类。事实上很多核心Java面试题和SCJP问题都是基于这些概念,下面是类初始化的一些规则:

2.3.2 类的初始化过程:

   初始化父类静态变量、静态代码块,

   初始化子类静态变量、静态代码块,

   初始化父类普通成员变量、代码块、父类构造方法,

   初始化子类普通成员变量、代码块、子类构造方法,


Java中对字段属性是静态绑定(编译出错),方法成员是动态绑定(运行出错)。


【转载】原文地址:https://blog.csdn.net/ca1m0921/article/details/80938628



作者: 不二晨    时间: 2018-7-10 14:42

作者: 吴琼老师    时间: 2018-7-12 16:16





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2