• 哪些操非会导致类的初始化?这句话的意思,类的加载不一定就会发生类初始化。虽然大多数时候,在类的加载时直接就初始化了。
    (1)main方法所在的类在加线时,直接就先初始化
    (2)new一个类的对象,一定会先完成类的初始化
    (3)调用该类的静态变量(final的常量除外)和静态方法
    (4)使用java.lang.reflect包的方法对类进行反射调用
    (5)当初始化一个类,如果其父类没有被初始化,则先会初始化他的父类
  • 哪些情况不会导致类的初始化?
    (1)引用静态常量(fina1)不会触发此类的初始化
    (2)当访问一个静态域时,只有真正声明这个域的类才会被初始化
    换句话说,通过子类访问父类的静态域时,只会初始化父类,不会初始化子类
    (3)通过数组定义类引用,不会触发此类的初始化
/*
 * 类的加载的结果,在方法区有一个唯一的Class对象来代表一个类型
 * 
 * 如何获取:
 *  1.类型名.class
 * 		说明:基本数据类型和void,只能通过这种方式。
 *  2.对象.getClass()  获取对象的运行时类型
 *  	说明:只能用于引用数据类型
 *  3.Class.forName("类的全名称")
 *  类的全名称: 包.类名	
 *  
 *  4.类加载器对象.loadClass("类的全名称")
 *  
 *  
 * 类的加载必须由类加载器(java.lang.ClassLoader)来完成。
 *  1.类加载器是负责加载类的对象
 *  2.每个Class对象都包含一个对定义它的ClassLoader的引用
 *  	通过Class对象可以得到加载它的类加载对象
 *  
 * 类加载器分为4大类
 *  1.根类加载器:使用原生代码c/c++实现,无法获得
 *  2.扩展类加载器:在JAVA_HOME/jre/ext/*.jar
 *  3.应用程序加载器
 *  4、自定义类加载器
 *		例如:tomcat
 *
 * 什么情形下自定义类加载器?
 * (1)字节码需要加密和解密(2)加裁特定目录下的类
 * 
 * 关系:4,3,2,1     4认3位parent加载器,但不是继承关系
 * 
 * 类加载过程是一个双亲委托模式加载的
 * 目的是为了安全,防止你写一个和核心类库一样的类
 * 	每一个加载器只负责自己路径下的东西
 */
/*
 * 类加载器的作用:
 * 1.加载类
 * 2.辅助作用:可以用它来加载“类路径下”的资源文件
 * 
 * ClassLoader
 * 	(1)ClassLoader.getSystemResourceAsStream()
 * 		这个适用于JavaSE阶段,因为他用应用程序类加载器去加载的
 * 		如果是web阶段,用这个不行,因为web阶段的类路径是在WEB-INF/classes下,
 * 		必须用自定义加载器加载
 *  (2)类加载器对象.getResourceAsStream()
 *  	web阶段建议适用这个
 */