Java类的初始化
原创
©著作权归作者所有:来自51CTO博客作者Zy开发的原创作品,请联系作者获取转载授权,否则将追究法律责任
- 哪些操非会导致类的初始化?这句话的意思,类的加载不一定就会发生类初始化。虽然大多数时候,在类的加载时直接就初始化了。
(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阶段建议适用这个
*/