概述
类里面的信息,是怎么加载的,按什么先后顺序?
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("子类静态方法被加载");
}
}