双亲委派类加载机制
当一个类在Java中被加载时,Java的类加载机制会按照以下步骤进行:
-
加载(Loading):类加载器负责将类的字节码数据从磁盘或网络中读取到内存中,并创建一个
java.lang.Class
对象来表示这个类。 -
链接(Linking):链接阶段包括三个子阶段:
- 验证(Verification):确保加载的类符合Java虚拟机规范,不会破坏虚拟机的健康状态。
- 准备(Preparation):为类的静态变量分配内存空间,并设置默认初始值。
- 解析(Resolution):将符号引用解析为直接引用,即将类、方法、字段的引用转换为直接引用。
-
初始化(Initialization):在这个阶段,类的静态变量会被赋予正确的初始值,静态代码块会被执行。如果这个类有父类,那么在初始化当前类之前,会先初始化父类。
Java的类加载机制是Java虚拟机(JVM)在运行时动态加载和链接类的过程。在Java中,类加载遵循双亲委派模型,这意味着当一个类加载器需要加载一个类时,它会先委托给其父类加载器加载,只有在父类加载器无法加载时,才会自己尝试加载。这种机制有助于确保类的唯一性和安全性。
关于"当前类加载必须先加载父类"的细节:
- 在Java中,子类在加载时,如果其父类还没有被加载,会先加载父类,确保父类的静态变量被正确初始化,父类的静态代码块被执行。
- 这是为了保证类的正确性和继承关系的完整性。子类通常会依赖于父类的属性和方法,因此父类需要先加载,以便子类能正确地继承和扩展父类的功能。
- 如果父类还没有加载,子类加载器会先委托给父类加载器加载父类,只有当父类加载完成后,才会加载子类。
当Java类加载器加载一个类时,如果这个类的父类还没有被加载,那么在加载当前类之前,父类会首先被加载。这是因为在Java中,一个类的定义依赖于其父类的定义,子类需要访问和扩展父类的属性和方法。因此,为了确保程序的正确性,父类需要先于子类加载。
-
联系:
- 在Java的类加载机制中,子类加载时必须先加载父类,这确保了类加载的顺序和依赖关系。
- 双亲委派模型中的类加载器会按照一定的顺序委托加载类,保证了类的唯一性和安全性。
-
区别:
- 类加载机制是Java虚拟机的一部分,而"当前类加载必须先加载父类"是一种规则或约定,确保类的正确加载顺序。
- 类加载机制涉及类加载器的工作原理和类加载的过程,而"当前类加载必须先加载父类"是一种编程规范,确保类的正确性和继承关系。
其实二者关系区别十分的明显,一个是类的加载机制,而加载类先加载父类是类加载的一部分,即可能全发生在用户类,即是用户类的一种人为规范,而类加载机制是一个更大的概念。