Java基础学习:注解和反射10( 分析类初始化 )
-
分析类初始化:
-
什么时候会发生类初始化:
-
类的主动引用(一定会发生类的初始化):
-
当虚拟机启动,先初始化main方法所在的类;
-
new一个类的对象;
-
调用类的静态成员(除了final常用)和静态方法;
-
使用java.lang.reflect包的方法对类进行反射调用;
-
当初始化一个类,如果其父类没有被初始化,则会优先初始化它的父类;
-
-
类的被动引用:(不会发生类的初始化)
-
当访问一个静态域时,只有真正声明这个域的类才会被初始化;如:当通过子类引用父类的静态变量,不会导致子类初始化;
-
-
引用常量不会触发此类的初始化(常量在连接阶段就存入调用类的常量池中了)
-
-
-
代码案例:测试类什么时候会初始化
?
/**
* 测试类什么时候会初始化:
*/
public class Test06 {
?
static {
System.out.println("mian类被初始化");
}
?
public static void main(String[] args) throws ClassNotFoundException {
?
/*//1,主动引用
Son son=new Son();
System.out.println(Son.b);
System.out.println(Son.m);
System.out.println(Son.M);
?
//反射也会产生主动引用
Class c=Class.forName("com.ljx5.demo02.Son");*/
?
//2,被动引用:不会产生类的引用的方法
// System.out.println(Son.b);
?
//3,数组
Son[] array=new Son[5];//main类被初始化
?
//4,
System.out.println(Son.M);
?
?
}
}
?
?
class Father{
?
static int b=2;
?
static {
System.out.println("父类被加载");
}
?
}
?
class Son extends Father{
?
static {
System.out.println("子类被加载");
m=300;
}
?
static int m=100;
static final int M=1;
}
?