package cn.sxy.demo02;
//什么时候类会发生初始化
public class Test05 {
static {
System.out.println("Main类初始化");
}
public static void main(String[] args) {
//1.类的主动引用(一定会发生类的初始化)
//当虚拟机启动,先初始化main方法所在的类
/** 打印结果
*Main类初始化
*/
//new一个类的对象
// S s = new S(); //当初始化一个类,如果父类没有初始化,则会先初始化其父类
/** 打印结果
* Main类初始化
* F类发生初始化
* Z类发生初始化
*/
//调动类的静态成员(除了final常量)和静态方法
//System.out.println(S.m);
/** 打印结果
* Main类初始化
* F类发生初始化
* Z类发生初始化
* 300
*/
//2.类的被动引用(不会发生类的初始化)
//当访问访问一个静态域时,只有真正声明这个域的类才会被初始化
//System.out.println(S.b);//子类引用父类的静态变量,不会导致子类初始化
/** 打印结果
* Main类初始化
* F类发生初始化
* 2
*/
//通过数组定义类引用,不会触发此类的初始化
//S[] ss = new S[2];
/** 打印结果
* Main类初始化
*/
//引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中)
//System.out.println(S.A);
/** 打印结果
* Main类初始化
* 1
*/
}
}
class F {
static int b = 2;
static {
System.out.println("F类发生初始化");
}
}
class S extends F {
static int m = 100;
static {
System.out.println("Z类发生初始化");
m = 300;
}
static final int A = 1;
}