引言:在java代码中,类型的加载、连接与初始化过程都是在程序运行期间完成的。
加载:查找并加载类的二进制数据(class文件加载到内存中)
连接:a 验证:确保被加载类的正确性。
b准备:为类的静态变量分配内存,并将其初始化为默认值。
c解析:把类中的符号引用转换为直接引用。
初始化:为类的静态变量赋予正确的初始值。
-----java程序对类的使用方式分为两种(主动使用,被动使用)
-----创建类的实例
-----访问某个类或者接口的静态变量 getstatic指令,或者对该静态变量赋值。 putstatic 指令
-----调用类的静态方法 invoke指令
-----反射
-----初始化一个类的子类
-----包含main方法的类
类的加载
类的加载指将类的.class文件的二进制数据读入到内存中,将其放在运行时数据的方法去内,然后在内存中创建一个java.lang.Class对象用来封装类在方法去内的数据结构。(hotspot虚拟机把其放入在方法区)
*加载.class文件的方式(jvm未指定class的加载路径)
---从本地系统中直接加载
---通过网络下载.class文件
---从zip jar等文件中加载class文件
---将java源文件动态编译为.class文件(运行期动态编译加载的类)
-xx:+TraceClassLoading 用于追踪类的加载信息并打印出来(-xx:+<option>表示开启option选项 -xx:-<option>表示关闭option选项 -xx:<option>=<value> 表示给选项赋值)
final : 在编译阶段,被final static 修饰的常量会放入到调用常量所在类的常量池中。不会触发定义类的常量的初始化。
javap -c .class文件 查看反编译信息 助记符ldc 表示将int float string 类型的常量值从常量池中推送至栈顶。 助记符bipush表示单字节(-128-127)的常量推送至栈顶。 若数字范围越界 则 助记符变为 sipush(短整形常量值)
iconst_(12345)提供了5个助记符
anewarray 创建一个引用类型的数组,并将其引用值压至栈顶 newarray 创建一个原始类型(int float char等)数组 ,并将其引用压至栈顶;
类加载器
*java虚拟机自带的加载器
根类加载器(Bootstrap)
扩展类加载器(Extension)
系统(应用)类加载器(system,application)
*用户自定义类加载器
继承java.lang.classLoader
当java虚拟机初始化一个类的时候,要求他的所有父类都已经被初始化;
在初始化一个类时,并不会初始化它所实现的接口;
在初始化一个接口时,并不会先初始化它的父接口;
因此一个父接口并不会应为他的子接口或者实现类的初始化儿初始化,只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。