本文由 ImportNew - 刘志军 翻译自 Javarevisited。欢迎加入翻译小组。转载请见文末要求。html
理解类在JVM中何时被加载和初始化是Java编程语言中的基础概念,正由于有了Java语言规范,咱们才能够清晰的记录和解释这个问题,可是不少Java程序员仍然不知道何时类被加载,何时类被初始化,类加载和初始化好像让人很困惑,对初学者难以理解,在这篇教程中咱们将看看类加载何时发生,类和接口是如何被初始化的,我并不会拘泥于类加载器的细节或者说类加载器的工做方式。仅仅使这篇文章更加专一和简结。java
类何时加载程序员
类的加载是经过类加载器(Classloader)完成的,它既能够是饿汉式[eagerly load](只要有其它类引用了它就加载)加载类,也能够是懒加载[lazy load](等到类初始化发生的时候才加载)。不过我相信这跟不一样的JVM实现有关,然而他又是受JLS保证的(当有静态初始化需求的时候才被加载)。面试
加载完类后,类的初始化就会发生,意味着它会初始化全部类静态成员,如下状况一个类被初始化:编程
反射一样可使类初始化,好比java.lang.reflect包下面的某些方法,JLS严格的说明:一个类不会被任何除以上以外的缘由初始化。编程语言
如今咱们知道何时触发类的初始化了,他精确地写在Java语言规范中。但了解清楚 域(fields,静态的仍是非静态的)、块(block静态的仍是非静态的)、不一样类(子类和超类)和不一样的接口(子接口,实现类和超接口)的初始化顺序也很重要类。事实上不少核心Java面试题和SCJP问题都是基于这些概念,下面是类初始化的一些规则:this
初始化例子spa
这是一个有关类被初始化的例子,你能够看到哪一个类被初始化翻译
1code 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
从上面结果能够看出:
再来看一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
分析:
还有另一个例子与接口相关的,JLS清晰地解释子接口的初始化不会触发父接口的初始化。强烈推荐阅读JLS14.4理解类加载和初始化细节。以上全部就是有关类被初始化和加载的所有内容。
原文连接: Javarevisited 翻译: ImportNew.com - 刘志军
译文连接: http://www.importnew.com/6579.html
[ 转载请保留原文出处、译者和译文连接。]