类加载过程:
public class SSClass { static { System.out.println("SSClass static"); } } public class SuperClass extends SSClass { static { System.out.println("SuperClass static"); } protected static int value=123; public SuperClass(){ System.out.println("SuperClass 构造函数"); } } /** 类加载过程:加载、验证、准备、解析、初始化、使用、卸载 加载:根据全限定类名生成类的二进制字节流类信息,并将其放到方法区 验证:主要验证二进制字节流是否符合当前虚拟机的要求 准备:正式为类变量(不包括实例变量)分配内存并设置类变量初始值。如果没有被final修饰的类变量则被初始化为0,null等;如果被final修饰,如 protected static final int value=123;则被初始化为123 解析:虚拟机将常量池中的符号引用替换为直接引用 初始化:类加载过程的最后一步,将静态变量(类变量)设置为给定值;执行静态代码块中的代码 使用:比如new,会调用构造函数 */ public class SubClass extends SuperClass { private static int a=111; static { System.out.println("SubClass static"); } public SubClass(){ System.out.println("SubClass 构造函数"); } public static void m1(){ int a=0; System.out.println(a); } public static void main(String[] args){ System.out.println(SubClass.value);//引用父类的静态字段会执行初始化 System.out.println(SubClass.a);//引用父类的静态字段会执行初始化 SubClass.m1();//引用父类的静态字段会执行初始化 SubClass subClass=new SubClass();//执行构造函数 } }
输出结果:
SSClass static
SuperClass static
SubClass static
123
111
0
SSClass 构造函数
SuperClass 构造函数
SubClass 构造函数
如果main()函数中什么都不写,则输出如下:
SSClass static
SuperClass static
SubClass static