类加载过程

类加载过程:

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

 
原文地址:https://www.cnblogs.com/BonnieWss/p/10978356.html