类的加载:
类的加载路线差不多是这样的:
加载->链接(验证->准备->解析)->初始化->使用->卸载
加载:会根据类是否有条件加载进行加载。一般分为五个条件:1.使用new,调用了类static变量或者是方法 2.使用反射 3.一个类初始化时先初始化其父类 4.运行主类(main) 5.动态语言
有几个情况不会加载:调用父类的static变量或方法,子类不会加载;被动引用不会加载如(Student[] j=new Student[10]);虽然是静态但是用final修饰的常量不加载该类
加载后:通过全限名(包名+类名)找到该类获取其二进制文件 -> 将二进制文件变为方法区中的数据结构 -> 生成一个代表此类的class文件 作为访问入口
链接:验证其是否为java识别文件,并对数据类型等进行检验;为类数据进行内存分配并赋初始值;把符号引用变为直接引用
初始化:初始化过程是执行类构造器<clinit>的执行过程。它会为静态变量赋值,并执行静态代码块。该过程是一个同步过程,单例模式就是利用其特点,在这个过程中创建对象
具体见《深入虚拟机》
对象的创建过程:
1.对象创建时,虚拟机会在堆中给类的实例变量和从父类继承的实例变量分配内存,并且默认初始值
2.执行实例变量和实例代码块
3.执行构造函数
重点讲一下构造函数:
在执行构造函数的时候,先要执行超类的构造函数。知道到达object再返回。
几个题
https://blog.csdn.net/justloveyou_/article/details/72466416
https://blog.csdn.net/justloveyou_/article/details/72466105
网友评论