先上一段代码:
main方法:
package com.sailmalan.malan.controller; /** * 功能描述 原子操作 atomic类 java.util.concurrent.atomic * * @author yaoqihui * @version 2021/7/3 * @see [相关类/方法] * @since [malan-rabbitmq] */ public class Test { public static void main(String[] args) { java.lang.String str=new java.lang.String(); System.out.println("双亲委派机制代码演示==="); } }
其中我们在定义一个String类,如下:在项目下建立包:java.lang:
然后看看执行main方法,看看输出是否在控制台顺序输出:我是自定义String类,双亲委派机制代码演示===
结果并不是我们想象的结果!!!为啥?明明我们在main方法已经引入:java.lang包,意思是已经制定引入的自定义String类,为啥???
这就是双亲委派机制!!!下面详细讲解(涉及到引导类的问题):我们先看一个图:
图解析为:系统类加载器(jvm的默认加载器),系统加载器开始加载java.lang.String类,开始委托了上一个 扩展类加载器,扩展类加载器再向上委托 引导类加载器,即这些加载器有多少个父类加载器,就以此递归直到最顶层的加载器,jvm只有三个加载器,所以这里最顶层的加载器是 引导类加载器。
图一:
图二:
看到最后的图二,恍然大悟!!!原来引导类加载器(Bootstrap ClassLoader)强制加载 java 开头的类