big123 LV1
阅读 240

类的初始化和对象的初始化

在类加载过程中,准备阶段是正式为类变量(static成员变量)分配内存并设置初始值的阶段,而初始化阶段是真正开始执行类中定义的java程序代码(字节码)并按程序猿的意图去初始化类变量的过程。更直接的说初始化阶段是执行类构造器clinit方法的过程。clinit()方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块static{}中的语句合并产生的,其中编译器收集的顺序是由语句在源文件中出现的顺序锁决定。
 类构造器clinit()与实例构造器innit()不同,它不需要程序员进行显式调用,虚拟机会保证在子类类构造器clinit()执行之前,父类的类构造clinit()执行完毕。由于父类的构造器clinit()先执行,也就意味着父类中定义的静态代码块/静态变量的初始化要优先于子类的静态代码块/静态变量的初始化执行。特别地,类构造器clinit()对于类或者接口来说并不是必需的,如果一个类中没有静态代码块,也没有对类变量的赋值操作,那么编译器可以不为这个类生产类构造器clinit()。此外,在同一个类加载器下,一个类只会被初始化一次,但是一个类可以任意地实例化对象。也就是说,在一个类的生命周期中,类构造器clinit()最多会被虚拟机调用一次,而实例构造器init()则会被虚拟机调用多次,只要程序员还在创建对象。
回复

使用道具 举报

 

回答|共 2 个

su46jm9i LV1

发表于 2021-1-29 10:20:47 | 显示全部楼层

斯锅以~~~~~~~~~~~
回复

使用道具 举报

su46jm9i LV1

发表于 2021-1-29 10:21:04 | 显示全部楼层

竟然完全看不懂了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则