java中的语言类型
基本数据类型
java虚拟机预先定义好的
引用类型
1,类(字节流)
2,接口(字节流)
3,数组(由java虚拟机直接生成)
4,泛型参数(编译过程中被擦除)
加载类的过程
加载
查找字节流,需要使用类加载器
java中的类加载器分为
Boot ClassLoader
Extension ClassLoader
Application ClassLoader
类加载器遵循双亲委派模型
上级类加载器不加载才能委托给下级类加载器去加载。这种机制保证了类的一致性,因为类的唯一性由类加载器和class文件决定
链接
将创建的类合并至java虚拟机中使之能执行,分为以下三步
1,验证
确保加载的类复合java虚拟机约束条件
2,准备
被加载的类静态字段分配内存
为引用数据类型赋值符号引用
3,解析
将符号引用解析为实际引用
java虚拟机规范并没有要求在链接阶段就要完成解析,它仅规定,如果某些字节码引用了符号引用,那么在执行这些字节码之前要完成解析
初始化
被final修饰的基本数据类型或者String类型,或被java虚拟机标记为常量值,其初始化有虚拟机完成
其他的初始化会被java编译器置于同一方法中并命名为<clinit>,java虚拟机会为其加锁保证他只能执行一次
只有完成初始化类才是可执行状态
类何时才被初始化
1,虚拟机启动初始化用户指定主类
2,遇到new关键字
3,初始化静态方法所在的类
4,初始化静态字段所在的类
5,子类初始化会触发父类初始化
6,接口定义defaulte,初始化直接或间接的实现了该接口的类,会触发接口初始化
7,反射调用
8,初次掉用methodHandler,methodHandler指向方法所在的类
比如经典的单例模式
public class Single {
private Single(){}
private static class SingleHolder{
static final Single INSTANCE = new Single();
}
public static Single getInstance(){
return SingleHolder.INSTANCE;
}
}
只有在调用getInstance的时候才会初始化Single类,因为类在初始化的时候是线程安全的,所以在多线程的情况下可以保证Single实例有且仅有一个