类加载顺序和类初始化顺序

初始化顺序:静态代码块-->代码块--->构造方法

父类静态代码块–>子类静态代码块–>父类普通代码块–>父类构造方法–>子类普通代码块–>子类构造方法;

继承的情况下:如果继承了父类,子类对象初始化,一定会触发父类对象初始化,并且父类对象初始化优先于字类

顺序是:父类静态优先--子类静态---父类的所有非静态(块和构造器)----子类的所有非静态(块和构造器)

静态的代码块只会执行一次,后面创建对象就不会执行

非静态代码块和非静态变量是同一等级

静态代码块和静态变量是同一等级

谁在前面谁先执行

顺序:

1.父类的静态代码块和父类的静态变量初始化(至于他俩的先后顺序完全是由他们在代码中的顺序所决定的)。

2.子类的静态代码块和子类的静态变量初始化(同上)。

3.父类的普通变量或代码块。

4.子类的普通变量或代码块。

5.父类的构造函数。

6.子类的构造函数。

所有的静态都是类的首次触发

类加载顺序:

加载、链接(验证、准备、解析)、初始化、使用、卸载

1)、加载

i)、java编译器加载类的二进制字节流文件(.class文件),如果该类有基类,向上一直加载到根基类(不管基类是否使用都会加载)。

ii)、将二进制字节码加载到内存,解析成方法区对应的数据结构。

iii)、在java逻辑堆中生成该类的java.lang.Class对象,作为方法区中该类的入口。

类加载器:分默认加载器和用户自定义加载器

Bootstrap ClassLoader:顶层加载器,由c++实现。负责JVM启动时加载JDK核心类库以及加载后面两个类加载器。

Extension ClassLoader:继承自ClassLoader的类,负责加载{JAVA_HOME}/jre/lib/ext目录下的所有jar包。

App ClassLoader:上面加载器的子对象,负责加载应用程序CLASSPATH目录下的class文件和jar包。

Customer ClassLoader:用户继承自ClassLoader类的自定义加载器,用来处理特殊加载需求。如Tomcat等都有自己实现的加载器。

类加载器采用双亲委托(自底向上查询)来避免重复加载类,而加载顺序却是自顶向下的。

2)、链接

i)、验证:字节码完整性、final类与方法、方法签名等的检查验证。

ii)、准备:为静态变量分配存储空间(内存单元全置0,即基本类型为默认值,引用类型为null)。

iii)、解析(这步是可选的):将常量池内的符号引用替换为直接引用。

类的加载和链接只执行一次,故static成员也只加载一次,作为类所拥有、类的所有实例共享。

3)、初始化

包括类的初始化、对象的初始化。

类的初始化:

初始化静态字段(执行定义处的赋值表达式)、执行静态初始化块。

注:有父类则先递归的初始化父类的。

对象的初始化:

如果需要创建对象,则会执行创建对象并初始化:

i)、在堆上为创建的对象分配足够的存储空间,并将存储单元清零,即基本类型为默认值,引用类型为null。

i)、初始化非静态成员变量(即执行变量定义处的赋值表达式)。

ii)、执行构造方法。

注:如果有父类,则先递归的初始化父类成员,最后才是本类。

4)、使用

5)、卸载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值