先上一段代码:
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 开头的类