类的初始化

前言

点赞在看,养成习惯。

点赞收藏,人生辉煌。

点击关注【微信搜索公众号:编程背锅侠】,第一时间获得最新文章。

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、在初始化一个接口时,并不会先初始化它的父类。

因此,一个父类接口并不会因为它的子类接口或者实现类的初始化而初始化,只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞流2023

小主,破费了,回头请你喝咖啡!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值