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;
}
?