JAVA类加载过程“
加载-》连接(验证、准备、解析)-》初始化
JAVA 类加载:
(1) 通过全类名获取定义此类的二进制字节流(jar、war、ear)
(2) 将字节流所代表的的静态存储结构,转换为方法区的运行时数据结构
(3) 在内存中生成一个代表该类的Class对象,作为方法区这些数据访问入口
JAVA 类连接
(1) 验证:文件格式验证、元数据验证、字节码验证、符号引用验证
(2) 准备:正式为类变量(static属性)分配内存;除final修饰的变量外,其他的都赋值为初始值(0、null、false)
(3) 解析:将常量池中的符号引用替换为直接引用。(即将符号变为内存地址)
JAVA 类初始化:
(1) 初始化调用的是()方法,该方法是带锁线程安全,所以在多线程环境进行类初始化可能会引起死锁
(2) 有5种情况下,必须对类进行初始化(……)
JAVA类的初始化顺序:
静态属性:static定义的属性
静态方法块:static{}内的方法块
普通属性:无static定义的属性
普通方法块:{}内的方法块
构造函数:
为什么构造函数最后执行?
如果先执行,可能赋值会被后续的方法或变量修改
父类和子类的初始化顺序:
父类静态属性、父类静态代码块
子类静态属性、子类静态代码块
父类普通属性、普通代码块、构造函数
子类普通属性、普通代码块、构造函数
JAVA 双亲委派模型
类加载时,优先去父类加载器中寻找是否有对应的类
一些考过的知识点:
(1)new某个类的数组时,不会触发类的初始化
(2)引用某个类的final修饰的且是基本类型的属性,不会触发类的初始化(final属性在加载阶段就分配并赋值了),但是如果是final修饰的引用类型的属性,则会触发初始化。
(3)子类引用父类的static属性,会初始化父类,不会初始化子类。
JAVA Stream的中间操作:
JAVA Stream的终止操作: