Java基础系列:Java类加载与初始化(一)

终于下决心整理一下Java底层的一些东西了,
实在是不知道从哪里入手,
所以准备从类的加载及初始化说起,有不对的地方欢迎留言批评指正,共同进步

1.类加载器

类加载器是一个用来加载类文件的类。
Java源代码通过javac编译器编译成类文件。
然后JVM来执行类文件中的字节码来执行程序。
类加载器负责加载文件系统、网络或其他来源的类文件。
JVM有三种默认使用的类加载器:
Bootstrap类加载器:加载rt.jar,使用C++编写没有父类
Extension类加载器:加载JRE/lib/ext或者java.ext.dirs指向的目录,父类是Bootstrap
Application类加载器:加载CLASSPATH环境变量中的类,父类是Extension

备注: 关于类的加载器就是三种:
1.Bootstrap封装于JVM内部,主要来加载Java原生的库函数
2.Extension在Java原生库里,主要用于加载第三方的一些库.
3.Application默认的加载器,除了上面两种情况,其余都由他来加载

2.类加载器的工作原理

类加载器的工作原理基于三个机制:委托、可见性和单一性
委托机制:
    加载一个类的时候会先委托其父类,假如父类已经加载该类,则直接返回类对象
    例如:使用Application来加载String类,他会委托Extension,然后Extension再委托Bootstrap来加载
        Bootstrap发现已经加载了String类则直接返回
        使用Application来加载A.class,他会委托Extension,然后Extension再委托Bootstrap来加载
        Bootstrap未找到A类路径,Extension来继续加载,Extension未找到A类路径,则Application来进行加载.
可见性:
    子类可以看到父类加载的类,父类不能看到子类加载的类
    假如你指定Bootstrap来加载我们自己写的类,父类是找不到这个类的.
单一性:
    父类加载过的类不能被子类再加载,即String类不会再被加载了,已经被Bootstrap加载

3.类加载过程:

Java的动态加载特性:
    当程序初次对类的静态成员的引用(如类的静态变量、静态方法、构造方法——构造方法也是静态的)时,才会加载该类.
ClassLoader将.class文件加载创建一个Class对象.

4.链接:

此步骤可理解为对.class对象的一些解析.
将已经加载的java二进制代码组合到JVM运行状态中去
验证:验证是保证二进制字节码在结构上的正确性.
准备:创建静态域,分配空间,给这些域设置默认值.
解析:解析的过程就是对类中的接口、类、方法、变量的符号引用进行解析并定位.

5.初始化

每个类或接口被java程序首次主动使用时才初始化.
主动使用的场景:
1) 创建类的实例
2) 访问某个类或者接口的静态变量,或者对该静态变量赋值
3) 调用类的静态方法
4) 使用Class.forName()反射
5) 初始化一个类的子类(相当于对父类的主动使用),不过直接通过子类引用父类元素,不会引起子类的初始化
6) Java虚拟机被标明为启动类的类(包含main方法的)
 类与接口的初始化不同,如果一个类被初始化,则其父类或父接口也会被初始化,但如果一个接口初始化,则不会引起其父接口的初始化。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值