美文网首页
二、类的加载、连接、初始化

二、类的加载、连接、初始化

作者: 社会yang | 来源:发表于2019-11-28 10:54 被阅读0次

    可以类的加载可以从通过以下几种方式加载:

    1):从本地系统中直接加载

    2):通过网络下载class文件

    3):从zip、jar等归档文件中加载class文件

    4):从专有的数据库中加载class文件

    5):将Java源文件动态的编译为class文件并加载(动态代理、jsp)

    类的加载详细定义

    类的加载指的是将类的.class文件的数据导入到内存中,将其放置到运行时数据区的方法区内,然后在创建一个java.lang.Class对象用来封装类在方法区内的数据结构(java虚拟机的规范并未要求该Class对象放在哪个区域,hotspot将该对象放在了方法区)

    java程序对类的使用方式

    主动使用

    被动使用

    java虚拟规范要求:所有java虚拟机实现每个类或者接口在被java程序 "首次主动使用" 时才初始化他们(注意此处是初始化不是加载或连接)

    主动使用主要包含以下6种:

    1):创建类的实列(new对象的时候)

    2):访问类或接口的静态变量或者为该静态变量赋值

    3):调用类的静态方法

    4):反射(如Class.forName)

    5):初始化该类的子类会自动初始化父类

    6):java虚拟机启动时标明为启动内的(及main方法所在的类)

    类的主动加载的举例说明

    运行第6行结果为:

    parent init

    str

    运行第7行,注释第6行,结果为:

    parent init

    child init

    str1

    通过结果可以得知运行第6行时没有加载子类,因为值使用了父类的静态变量不满足对子类的主动使用,属于对子类的被动使用

    运行第7行,因为使用了子类的静态变量会初始化子类同时也会初始化父类

    疑问: 运行第6行的时候到底Child有没有加载呢?

    可以通过 -XX:+TraceClassLoading 用于追踪类的加载过程,查看 Child类是否加载,最终可以观察到Child类会加载

    常用的开启虚拟机打印的命令:

    -XX:+<option>        表示开始option选项

    -XX:-<option>        表示关闭option选项

    -XX:<option>=<value>    表示设置option的值为value

    类连接过程中,变量的准备阶段用法

    此时结果都为1,没什么问题

    此时说明,当完成准备阶段后,变量都有默认的初始值,进行初始化的时候程序是按照顺序执行的,当执行到第4行时count2只完成了准备阶段还没完成初始化所以此时 count2为0,最终为count2进行初始化的时候又重新设置为0了

    相关文章

      网友评论

          本文标题:二、类的加载、连接、初始化

          本文链接:https://www.haomeiwen.com/subject/ijmmwctx.html