类加载过程
加载->验证->准备->解析->初始化->使用->卸载
类的主动引用(一定会发生类的初始化)
1.new一个对象
2.调用类的静态成员(除了final常量)和静态方法
3.使用java.lang.reflect包的方法对类进行反射调用
4.当虚拟机启动,java Hello,则一定会初始化Hell类,先启动main方法所在的类
5.当初始化一个类,如果父类没有被初始化,则会先初始化它的父类
类的被动引用(不会发生类的初始化)
1.当访问一个静态类时,只有真正声明该静态类的域才会被初始化
2.通过数组定义类的引用,不会触发该类的初始化
3.引用常量不会触发此类的初始化
测试代码如下:
public class Demo01 {
static{
System.out.println("静态初始化Demo01");
}
public static void main(String[] args) throws Exception {
System.out.println("Demo01的main方法!");
//主动引用
// new C();//new一个对象
// System.out.println(C.width);//调用类的静态成员
// Class.forName("com.bjsxt.test.C");//使用java.lang.reflect包的方法对类进行反射调用
//被动引用
// System.out.println(C.MAX);//引用常量不会触发此类的初始化
// C[] as = new C[10];//通过数组定义类的引用,不会触发该类的初始化
System.out.println(B.width);//当访问一个静态类时,只有真正声明该静态类的域才会被初始化(此处因为width在
//C中初始化,所以B不会初始化,C初始化)
}
}
class B extends C {
static {
System.out.println("静态初始化B");
}
}
class C extends C_Father {
public static int width=100; //静态变量,静态域 field
public static final int MAX=100;
static {
System.out.println("静态初始化类C");
width=300;
}
public C(){
System.out.println("创建C类的对象");
}
}
class C_Father extends Object {
static {
System.out.println("静态初始化C_Father");
}
}
结果如下:
静态初始化Demo01
Demo01的main方法!
静态初始化C_Father
静态初始化类C
300