博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java虚拟机JVM学习04 类的初始化
阅读量:4983 次
发布时间:2019-06-12

本文共 1115 字,大约阅读时间需要 3 分钟。

Java虚拟机JVM学习04 类的初始化

类的初始化

  在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值。

  在程序中,静态变量的初始化有两种途径:

  1.在静态变量的声明处进行初始化;

  2.在静态代码块中进行初始化。

  没有经过显式初始化的静态变量将原有的值。

 

  静态变量的声明语句,以及静态代码块都被看做类的初始化语句,Java虚拟机会按照初始化语句在类文件中的先后顺序来依次执行它们。

 

类的初始化步骤

  1.假如这个类还没有被加载和连接,那就先进行加载和连接。

  2.假如类存在直接的父类,并且这个父类还没有被初始化,那就先初始化直接的父类。

  3.假如类中存在初始化语句,那就依次执行这些初始化语句。

 

类的初始化时机

  Java程序对类的使用方式可以分为两种:

  1.主动使用

  2.被动使用

  所有的Java虚拟机实现必须在每个类或接口被Java程序首次主动使用时才初始化它们。

 

  主动使用的六种情况:

  1.创建类的实例。 

  2.访问某个类或接口的静态变量,或者对该静态变量赋值。 

  3.调用类的静态方法 

  4.反射

  5.初始化一个类的子类

  6.Java虚拟机启动时被标明为启动类的类

   除了以上六种情况,其他使用Java类的方式都被看作是对类的被动使用,都不会导致类的初始化。

 

接口的特殊性

  当Java虚拟机初始化一个类时,要求它的所有父类都已经被初始化,但是这条规则并不适用于接口。

    在初始化一个类时,并不会先初始化它所实现的接口。

    在初始化一个接口时,并不会先初始化它的父接口。

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

 

final类型的静态变量

  final类型的静态变量是编译时常量还是变量,会影响初始化语句块的执行。

  如果一个静态变量的值是一个编译时的常量,就不会对类型进行初始化(类的static块不执行);

  如果一个静态变量的值是一个非编译时的常量,即只有运行时会有确定的初始化值,则就会对这个类型进行初始化(类的static块执行)。

 

主动使用的归属明确性

  只有当程序访问的静态变量或静态方法确实在当前类或当前接口中定义时,才可以认为是对类或接口的主动使用。

 

ClassLoader类

  调用ClassLoader类的loadClass()方法加载一个类,并不是对类的主动使用,不会导致类的初始化。

转载于:https://www.cnblogs.com/zno2/p/4549927.html

你可能感兴趣的文章
gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)
查看>>
struts2学习笔记——常见报错及解决方法汇总(持续更新)
查看>>
蓝桥杯之入学考试
查看>>
新公司java的注解以及springboot的相关注解
查看>>
Unity脚本的生命周期中几个重要的方法
查看>>
poj1552
查看>>
Thinkphp中文水印和图片水印合体集成插件
查看>>
FLASK安装--兼收EZ_INSTALL及PIP
查看>>
C++静态成员变量和静态成员函数小结
查看>>
Python---Flask--02--模板
查看>>
PHP学习笔记---封装(面向对象三大特性之一)
查看>>
如何快速找到指定端口被哪个程序占用并释放该端口(解决bindException)
查看>>
迭代之while循环(1)
查看>>
final修饰的类有什么特点
查看>>
关于string类中find函数的讲解
查看>>
程序员的情书
查看>>
Spring Cloud Eureka 使用 IP 地址进行服务注册
查看>>
Python 包的制作(__init__.py)
查看>>
通过时间查询
查看>>
java内存模型优化建议
查看>>