JVM学习
类实列化: 为新的对象分配内存 为实例变量赋默认值 为实例变量赋正确的初始值 java编译器为它编译的每一个类都至少生成一个实例初始化方法 ,在java的class文件中,这个实例初始化方法被称为""。 针对源代码中每一个类的构造方法,java编译器都会产生一个 方法
类的加载的最终产品是位于内存中的Class对象 Class对象封装了类在方法区内的数据结构,并且 向java程序员提供了访问方法区内的数据结构的接口
有两种类型的类加载器 1:java虚拟机自带的加载器 1. 根类加载器(Bootstrap) 2. 扩展类加载器(Extension)-java.lang.ClassLoader的子类 3. 系统(应用)类加载器(System)-扩展类的子类
2:用户自定义的类加载器 1. java.lang.ClassLoader的子类 2. 用户可以制定类的加载方式
类加载器并不需要等到某个类被“首次主动使用”时再被记载它。
JVM规范允许类加载器在预料某个类将要被使用时就预先加载它, 如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载 器必须在程序首次主动使用该类时才报告错误(LinkageError)。 如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。
类的验证: 类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的 二进制数据合并到虚拟机的运行时环境中去。 类的验证的内容 1. 类文件的结构检查 2. 语义检查 3. 字节码验证 4. 二进制兼容性的验证
静态变量的两种初始化途径 1. 在静态变量的声明处进行初始化。 2. 在静态代码块中进行初始化。
类的初始化步骤 1. 假如这个类还没有被加载和连接,那就先进行加载和连接。 2. 假如类存在直接父类,并且这个父类还没有被初始化,那就先初始化直接父类 3. 假如类中在初始化语句,那就依次执行这些初始化语句。
双亲委托机制,加载器(有且仅有一个父类——根加载器除外(没父类加载器))去加载一个类时,会让其父加载器先去加载,若父加载器能够加载就父加载器加载,若不行在该加载器去加载,都不行就会报错。
验证:当一个接口在初始化时,并不要求其父接口都完成了初始化。 只有在真正使用到父接口的时候(如引用接口中所定义的常量时),才会初始化。
输出: 以上例子验证当一个接口在初始化时,并不要求其父接口都完成了初始化成功。
|