类装载
转至:https://www.baidu.com/link?url=9Wj6fpoIwdg_GiqyIsFeNn5NMp2YbiiUy7u4sja__7zmsYQATVApLQLvJIGfsBDS7QPEmVgJUL1GB6e-YnS3S_&wd=&eqid=de4c80aa000023f1000000065fc12f26
- 在任何时刻,第一次访问某类,都会执行类装载
- 访问包括三种情况:
- 使用某类的static方法
- 访问某类的static属性
- 构造某类的对象
-
声明没有初始化的引用Administrator admin;,并不会导致类装载(This is lazy load)
-
一个类的装载只会执行一次
类装载的工作清单:
- 加载.class字节码文件:根据包语法决定的路径找到.class文件并加载
- 为static属性分配存储空间并全部置为默认值(Q:默认值是多少)
- 装载父类:如果这个类有父类,且父类还没有被装载过,则先装载它的父类;否则继续
- 进行类初始化:按照类定义中的顺序,从上到下初始化static属性和执行static块中的语句
-
如果使用赋值运算符显示赋值,就执行赋值操作
private static int count=0;
-
如果等号右边的值所述的类尚未被装载,那么先装载等号右边的类再赋值
-
如果没有用赋值运算符显示赋值,则什么也不干(保留默认值)
private static Leader leader;
-
即使这个属性所属的类尚未被装载,也不会去装载这个类lazy load
-
如果static块中的语句会使用未装载的类,则先装载这个类,再执行这条语句static{…}
-
即使本类的所有方法(包括构造器)都会使用未装载的类,也不会导致类加载;直到这些方法真正被执行的时候,才会判断使用到的类是否已被装载lazy load
-
static块的执行和static属性的初始化是用一个过程,执行的先后顺序只取决于他们在类中定义的顺序
-
父类的初始化在父类的装载过程中完成
特殊情况
要使用类,必须有两个步骤,一个是加载类,然后是初始化。
创建一个类的实例可以使用到的方法:
- 使用new关键字
- 通过反射
- 克隆
- 反序列化
在什么情况下使用类,不需要初始化类
通过子类调用父类的静态变量,子类不会被初始化,但是子类会被加载。
public class Parent {
static {
System.out.println("Parent init