类加载过程

概述

类里面的信息,是怎么加载的,按什么先后顺序?

1、类的加载过程
JVM将类的加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)
1)、装载:查找并加载类的二进制数据;
2)、链接:
        验证:确保被加载类的正确性
        准备:为类的静态变量分配内存,并将其初始化为默认值
        解析:把类中的符号引用转换为直接引用
3)、初始化:为类的静态变量赋予正确的初始值

2、类的初始化,类什么时候才被初始化
1)、创建类的实例,也就是new一个对象
2)、访问某个类或接口的静态变量,或者对该静态变量赋值
3)、调用类的静态方法
4)、反射(Class.forName("com.vince.Dog"))
5)、初始化一个类的子类(会首先初始化子类的父类)
6)、JVM启动时标明的启动类,即文件名和类名相同的那个类

3、类的加载
值的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的Java.lang.Class对象,用来封装类在方法区类的对象。

实例

/**
 * 类的加载过程
 *      1.new子类对象,先加载父类
 *      2.只调用父类静态变量(初始化过程),不加载子类
 *      3.调用常量(链接过程),子类父类都不加载
 */
public class Demo01 {
    static {
        System.out.println("Main静态方法被加载");
    }

    public static void main(String[] args) {
//        Son son = new Son();
//        System.out.println(Son.a);
//        System.out.println(Son.b);
        System.out.println(Son.c);
    }
}
class Father{
    static int a = 1;
    static {
        System.out.println("父类静态方法被加载");
    }
}
class Son extends Father{
    static int b = 2;
    static final int c = 3; //常量
    static {
        System.out.println("子类静态方法被加载");
    }
}
原文地址:https://www.cnblogs.com/gbhh/p/13768145.html