前言
点赞在看,养成习惯。
点赞收藏,人生辉煌。
点击关注【微信搜索公众号:编程背锅侠】,第一时间获得最新文章。
1 本节要点 简介
- 类的初始化步骤
- 类的初始化的六大时机
- class对象获取的方式有哪些?会不会引起初始化?区别是什么?
- 类的实例化都干了什么?
- 接口的初始化时机?
2 类的初始化步骤
假如这个类还没有被加载和连接,那就先进行加载和连接。
假如类存在直接父类,并且这个父类还没有被初始化,那就先初始化直接父类。
假如类中存在初始化语句,那就依次执行这些初始化语句。
3 类的初始化的六大时机
1、创建类的实例(new xxxClass() Class.newInstance() constructor.newInstance())。
2、访问类中的某个静态变量,或者对静态变量进行赋值。
3、调用类的静态方法。
4、反射class.forName(“全限定类名”)。
5、完成这类的初始化,也会完成对本类的初始化(接口除外)。
6、该类是程序引导人口(main入口或者test入口)。
7、JDK1.7开始提供的动态语言支持;java.lang.invoke.MethodHandle实例的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic句柄对应的类没有初始化则初始化。
总结:只有当程序访问的静态变量或静态方法确实在当前类或当前接口中定义时,才可以认为是对类或接口的主动使用。
4. class对象获取的方式有哪些?会不会引起初始化?区别是什么?
类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的二进制数据和并到虚拟机的运行时环境中去。
4.1 验证
类验证的内容,确保被加载类的正确性。
1、Class clazz1 = 类名.class
没有完成初始化过程
2、Class clazz2 = 类名.class.getClassLoader().loadClass(“全限定名”);
没有完成初始化过程
3、Class clazz3 = Class.forName(“全限定名”)
完成初始化过程
4、Class clazz4 = 对象引用.getClass();
对象存在了,完成了初始化过程
总结:四种方式的不同点为有没有初始化。
5 类的实例化都干了什么?
1、为新的对象分配内存。
2、为实例变量赋于默认值。
3、为实例变量赋于正确的初始值。
4、Java编译器为它编译的每一个类都至少生成一个实例初始化方法,在java的class文件中,这个实例初始化方法被称为“”针对源代码中每一个类的构造方法,Java编译器都产生一个“”方法。
问:public static int i = 100 怎么赋值的?
😄准备阶段赋分配内存并将初始值为0
😁初始化阶段赋值为100
5 接口的初始化时机?
当Java虚拟机初始化一个类时,要求它的所有父类都已经被初始化,但是这条规则并不适用于接口。
1、在初始化一个类时,并不会先初始化它实现的接口。
2、在初始化一个接口时,并不会先初始化它的父类。
因此,一个父类接口并不会因为它的子类接口或者实现类的初始化而初始化,只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。