类加载小结

本文详细介绍了Java类加载的过程,包括编译、加载、解释和执行四个步骤。重点讲解了类加载的双亲委托机制,解释了何时加载类文件、谁来加载以及加载规则。还探讨了类的链接、初始化、使用和卸载阶段。此外,文章通过实例说明了类加载顺序,并提出了关于字符串对象创建的小问题。

1.源码文件(.java)–>代码指向的过程

编译—>加载—>解释—>执行

1.1 编译

将源码文件编译成JVM可以解释的class文件。编译过程会对源代码程序做语法分析,语义分析,注解处理等等处理,最后才生成了字节码文件。

1.2 加载(我们后面要重点研究)

将编译后的class文件加载到jvm中。

1.3 解释

这个阶段它做的事情可以总结为:把字节码转换为操作系统识别的指令。

1.4 执行

操作系统把解释器解析出来的指令码,调用系统的硬件执行最终的秩序程序指令。

2. 类加载

2.1 什么是类加载

类(文件 Hello.class)-------> jvm(加载到内存的过程)

2.2类加载的顺序

2.2.1加载

加载class文件,同时会在内存中创建一个特殊的class对象。类.class/对象.getClass/Class.forName(包.类)

	Car c =new Car();
		
	System.out.println(c.getClass());
	System.out.println(Car.class);


	Class<?> clazz = Class.forName("com.dyit.classloader.Car");

2.2.1.1何时加class文件

为了节省内存的开销,并不会一次性把所有的类全部都加载值jvm,而是等到有需要的时候才进行装载
1.new Car();----->new
2.Class.forName(“包.类”);--------->反射

2.2.1.2谁来加载class文件

类加载器。。

  1. Bootstrap----->根加载器
  2. Extension-------->扩展加载器
  3. Application------------>系统加载器
    这3个类加载器的关系:qpp------>继承了Ext------->继承了Bootstrap
		System.out.println(clazz.getClassLoader());
		System.out.println(clazz.getClassLoader().getParent());
		System.out.println(clazz.getClassLoader().getParent().getParent());
2.2.1.3 加载规则:双亲委托机制

当前类加载器不会自己尝试去加载这个类,而是把请求委托给父加载器去完成,以此向上。

xxx.class---->Application(加载)------>Ext(检查)------->Bootstarp

2.2.2链接

验证class文件内容是否合法

  1. 验证
    0xCAFEBABE,合法的class文件一般是以0x开头的16进制。
  2. 准备
    为类变量(static修饰)分配内存空间,static–>方法区,初始化
class  A{
  static int x = 3;   --->分配static内存   x=0;

}
  1. 解析
    将class文件中的符号,接口等对应java中的符号接口等。

2.2.3初始化:对类变量的初始化

x=3;//对类变量进行初始化赋值

需要注意的是,普通变量依然没有初始化。普通变量的初始化在其构造方法内

2.2.4使用

2.2.5卸载

3. 小问题

String s =“abc”;创建了几个对象?

有可能1个(String.class),有可能2个(String.class,abc(常量池没有))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值