编译文件为 .class文件,然后通过类加载,加载到JVM
- 连接阶段
第一步(验证):确保Class类文件没问题
第二步(准备):先初始化为 a=0。(因为你int类型的初始值为0)
第三步(解析):将引用转换为直接引用
- 初始化阶段:
通过此解析阶段,把1赋值为变量a
**类的加载**
下面是对于加载过程最为官方的描述。
加载阶段是类加载过程的第一个阶段。在这个阶段,JVM 的主要目的是将字节码从各个位置(网络、磁盘等)转化为二进制字节流加载到内存中,接着会为这个类在 JVM 的方法区创建一个对应的 Class 对象,这个 Class 对象就是这个类各种数据的访问入口。
其实加载阶段用一句话来说就是:把代码数据加载到内存中。这个过程对于我们解答这道问题没有直接的关系,但这是类加载机制的一个过程,所以必须要提一下。
**类加载器的分类**
* Bootstrap ClassLoader 启动类加载器
* Extention ClassLoader 标准扩展类加载器
* Application ClassLoader 应用类加载器
* User ClassLoader 用户自定义类加载器
### [](https://gitee.com/vip204888/java-p7)**2、双亲委派机制**
先看一段代码
package java.lang;
public class String {
//双亲委派机制:为了保证安全
//1.APP-->EXC-->BOOT(最终执行)
//BOOT
//EXC
//APP
public String toString(){
return "hello";
}
public static void main(String[] args) {
String s = new String();
s.toString();
}
}
idea报了一个错误:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210416170002863.png)
这是因为,在运行一个类之前,首先会在应用程序加载器(APP)中找,如果APP中有这个类,继续向上在扩展类加载器EXC中找,然后再向上,在启动类( 根 )加载器BOOT中找。如果在BOOT中有这个类的话,最终执行的就是根加载器中的。如果BOOT中没有的话,就会倒找往回找。
**过程总结**
1. 类加载器收到类加载的请求
2. 将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
3. 启动类加载器检查是否能够加载当前这个类,能加载就结束,使用当前的加载器,否则,抛出异常,一层一层向下,通知子加载器进行加载
4. 重复步骤3
# 最后
现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。
所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。
**[资料获取方式:戳这里免费下载](https://gitee.com/vip204888/java-p7)**
都是做分布式系统。
所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。
**[资料获取方式:戳这里免费下载](https://gitee.com/vip204888/java-p7)**
![](https://img-blog.csdnimg.cn/img_convert/d8c9b612ad20b889af080d1480d0bc3f.png)