1.定义
先了解一下java虚拟机怎么加载类:
1.按需加载。当需要使用这个类的时候才会加载该类
2.双亲委派机制。将请求交给父类处理
具体的定义:当一个类加载器收到需要加载的请求时,它自己不会先去加载,而是将这个请求交给父类的加载器去加载,如果父类的加载器还有父类,那就一直向上请求直到请求到顶级的加载器。
如果父类可以成功加载,那就直接成功返回;如果父类不能成功加载,那就由子加载器尝试自己加载。
实际上就是收到请求后自己先不处理给父类处理。
2.优势
2.1 避免类的重复加载
一个类只会被加载一次
2.2 保证程序安全
这个是重点!!!
可以保证程序安全,防止核心的API被篡改
比如:
(1)新建String类
新建一个java.lang.String类。
package java.lang; public class String { static { System.out.println("这是自定义String"); } }
在另外的一个test类中new一个String对象,那这里的对象是Java核心API中的String对象还是我们自己新建的String类对象呢?
package com.study.base.threadDemo; public class Test { public static void main(String[] args) { String str=new String(); System.out.println("hello"); } }
输出:
答案:java核心API中的String对象。
原因:就是因为双亲委托机制。当JVM想要加载String类时,此时的类加载器不会加载,会想自己的父类请求,当BootStrap ClassLoader看到这个类是java包下的就会去加载,直接返回成功加载Java核心API下的String对象。
(2)String类中不能有main()