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

2019-11-28  本文已影响0人  社会yang

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

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了

上一篇下一篇

猜你喜欢

热点阅读