类加载小结

1 类加载

类加载是将写好的类(也就是文件hello.class)通过jvm加载到内存的过程

2 类加载的顺序

  1. 加载:加载class文件
  2. 链接:class文件内容是否合法
  3. 初始化:对类中的类变量(静态变量)和静态代码块初始化
  4. 使用
  5. 卸载

2.1 加载

加载class文件

  • 在内存中创建一个特殊的Class对象
public class Car {
	public static void main(String[] args) {
		Car c = new Car();
		// 三种方式拿到Class对象
		System.out.println(c.getClass());// 方式一
		System.out.println(Car.class);// 方式二
		Class<?> clazz = Class.forName("com.zuo.classloader.Car");//方式三
		System.out.println(clazz);
	}

}

在这里插入图片描述

  • 何时加载class文件?
  1. new Car();
  2. Class.forName(包名.类名);
  • 谁来加载Car.class:类加载器
  1. Bootstrap类加载器
  2. Extension类加载器
  3. Application类加载器

app–>继承—>ext–>继承–>-bootstrap

双亲委派机制
Car.class—>加载(App)–>Ext(检查)–>Bootstrap(检查)

检查:如果已经有这个类,就不允许加载

2.2 链接

class文件内容是否合法

  • 验证阶段 用于确保加载的Class文件的字节流包含的信息是否符合虚拟机要求,保证其正确性合法性;0xCAFEBABE开头
  • 准备阶段 为类变量(static修饰的变量)分配内存空间(方法区)并根据对象类型设置相应的默认初始值(比如int类型为0,Integer类型为null)
  • 解析阶段

2.3 初始化

对类中static修饰的属性,static代码块进行初始化,静态变量(类变量)被赋值

  • 类中的构造方法里内容,在具体创建对象的时间再进行初始化,已经不属于类加载阶段了。
  • 非静态的属性和代码块是在创建对象之前初始化

2.3.1 各种类型变量的初始化顺序

常量 -->早于 -->static -->早于 -->普通变量 。只有static在类加载过程被赋值,常量早在编译阶段就已经赋值,普通变量在创建对象的时候被赋值。因此static修饰的内容不属于对象。 但是对象可以访问static的内容。

  1. 常量 在编译 (.java文件编译成.class文件的时候)的时候就会被分配具体值
  2. 静态变量 (类变量) 在类加载过程的初始化阶段被赋值
  3. 成员变量 在对象初始化时赋值

2.4 使用

2.5 卸载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值