#两种构造器
- <clinit>:类构造器,主要作用是对静态成员完成初始化;
- <init>:实例构造器,主要作用是对非静态成员(实例成员)完成初始化;
#成员变量显式赋值
public static int num = 10;
#成员变量隐式赋值
public static int num; 注:此时 num 等于 int类型的默认值 0
#类的生命周期
加载 —> 验证 —> 准备 —> 解析 —> 初始化 —> 使用 —> 卸载(对象被GC回收)
#类的加载过程
加载 —> 链接(验证、准备、解析)—> 初始化
- 加载:将对应的字节码文件(二进制字节流)加载到内存中;
- 验证:验证字节码文件的合理性、正确性,主要包括四种验证,文件格式验证、元数据验证、字节码验证、符号引用验证;
- 准备:为类的静态变量分配内存并赋予默认值(隐式赋值),这里不会对实例变量分配内存,因为静态变量被分配在方法区,实例变量会随着对象的创建分配到堆空间;
- 解析:将常量池中的符号引用转换为直接引用的过程;
- 初始化:执行类构造器的过程,涉及到类的静态变量赋予初始值(显式赋值)以及静态代码块的执行;
# 被 final 修饰的静态变量的显式赋值阶段的几种情况
- 若静态变量属于基本类型,且值也为基本数据类型,显示赋值发生在准备阶段;如:public static final int num = 10
- 若静态变量属于 String 类型,且值为字符串字面量,显示赋值发生在准备阶段;如:public static final String name = "songy"
- 除上面两种情况外,其他情况的显式赋值通常都是发生在初始化阶段;
#类的主动使用
#类的被动使用