温州微网站,VIP视频网站有得做吗,高品质网站设计,响应式网站的设计尺寸一、概要#xff1a;类的生命周期从类的 加载、连接、初始化 开始#xff0c;到类的 卸载结束#xff1b;二、几个阶段#xff1a;加载#xff1a;查找并加载类的二进制数据。(把类的.class文件的二进制数据读入内存#xff0c;存放在运行时数据区的方法区#xff1b;类…一、概要类的生命周期从类的 加载、连接、初始化 开始到类的 卸载结束二、几个阶段加载查找并加载类的二进制数据。(把类的.class文件的二进制数据读入内存存放在运行时数据区的方法区类加载的最终结果是产生堆区中描述对应类的Class对象)连接包括验证、准备和解析三个子阶段验证确保补加载类的正确性准备为类的静态变量分配内存并设定默认值解析把类中的符号引用转换为直接引用初始化给类中的静态变量赋予正确的初始值类的加载时机并不需要等到某个类被主动使用时才加载虚拟机会预测某个类将要被使用就加载它类的初始化时机a. 创建类(new、反射、克隆、反序列化)b. 使用静态方法、非静态变量c. Class.forName(ATest); 获取描述类的Class对象另初始化子类父类被先初始化。虚拟机的启动类使用命令 java Sample(也算是创建类)注使用能在编译期能得知的final static修饰的常量不会导致类的初始化public static final int a 2*3//编译时常量不会导致类初始化public static final int a b (int)(Math.random()*10)/101; // 不是编译时常量会初始化只有当程序访问的静态变量或静态方法的确在当前类或接口中定义时才可以看作是对类或接口的主动使用(如用子类引用调用父类静态方法或变量只会初始化父类)调用ClassLoader.loadClass()方法加载一个类时只会加载但不会初始化子类父类初始化过程先对这个类进行加载和连接- 如果有直接父类先加载连接初始化这个父类-重复以上步骤直到所有父类初始化初始化当前类(先加载连接当前类再加载连接初始化父类再初始化当前类)classBase {static{System.out.println(init Base);}}class Sub extendsBase {static{System.out.println(init Sub);}}public class ATest extendsSub {static{System.out.println(init ATest);}public static voidmain(String args[]) {System.out.println(main methos);}}结果init Baseinit Subinit ATestmain methosView Code三、类加载器除了Java虚拟机自带的根类加载器以外其余的类加载器有且只有一个父加载器Java虚拟机自带以下几种加载器根(Bootstrap)类加载器没有父类加载器。负责加载虚拟机核心类sun.boot.class.path路径下类库java.lang.*; 实现依赖于底层操作系统没有继承java.lang.ClassLoader扩展(Extension)类加载器父加载器为根加载器加载java.ext.dirs下的类库 和 JDK目录下jre/lib/ext目录下类库继承于java.lang.ClassLoader系统(System)类加载器也称应用类加载器父加载器为扩展类加载器加载classpath路径下指定的类库继承于java.lang.ClassLoader也是自定义加载器的默认父类父亲委托机制类加载过程中会先从最顶层加载器(一般是根加载器)开始往下先判断父类加载器能不能加载能加载则往下传递返回加载的类不能加载则继续往下判断如果都不能加载则会抛出ClassNotFoundException异常加载器之间的父子关系实际上是指加载器对象之间的包装关系而不是类之间的继承关系命名空间命名空间由该加载器及所有父加载器所加载的类组成唯一性在同一个命名空间中不会出现类的完整名字(包名类名)相同的两个类同一命名空间有以下关系同一命名空间的类是相互可见的(可见是指可以直接使用其类名不可见的类之间可以通过反射来获取类信息)子加载器的命名空间所含所有父加载器的命名空间所有子类加载器的类能看见父加载器的类但父加载器不能看见子加载器的类运行时包包名相同且属于同一个类加载器同一运行时包的类才能包可见如用户自己定义了一个java.lang.Spy并由自己定义的类加载器加载由于java.lang.Spy和核心类库java.lang.*由不同的类加载器加载它们不在同一运行时包Spy不能访问java.lang.*下的包可见类用户自定义类加载器扩展java.lang.ClassLoader类然后覆盖它的findClass(String name)方法可通过 this.getClass().getClassLoader()获取类对应的加载器类的卸载(清除对应类的Class对象 和 类的二进制数据结构)由Java虚拟自带的三个类加载器加载的类不能卸载(虚拟机会始终引用这3个类加载器类加载器中有一个集合又会一直引用其加载的类的Class对象)用户自定义的类加载器加载的类可以被卸载整理自孙卫琴《Java面象对象编程》