JAVA类的加载和初始化

一、类的加载和初始化过程


JVM将类的加载分为3个步骤:

1、加载(Load):class文件创建Class对象。

2、链接(Link)

3、初始化(Initialize)

其中 链接(Link)又分3个步骤,如下图所示:

类什么时候才被初始化:

1)创建类的实例,也就是new一个对象

2)访问某个类或接口的静态变量,或者对该静态变量赋值 或者调用类的静态方法(注意:访问常量不会触发)

3)反射(Class.forName("com.lyj.load")) (注意:classLoader.loadClass只动态装载,不会初始化)

4)初始化一个类的子类(会首先初始化子类的父类)

5)JVM启动时标明的启动类.

注意:

  1、类加载不一定会初始化。一个类只加载一次。

  2、在初始化一个类或接口时,并不会先初始化它所实现的接口。

  3、如果静态方法或变量在parent中定义,从子类进行调用,则不会初始化子类。

二 、Class.forName(className)与ClassLoader.loadClass

1、 Class.forName(className)方法,内部实际调用的方法是  Class.forName(className,true,classloader);

第2个boolean参数表示类是否需要初始化,  Class.forName(className)默认是需要初始化。一旦初始化,就会触发目标对象的 static块代码执行,static参数也也会被再次初始化。

2、 ClassLoader.loadClass(className)方法,内部实际调用的方法是  ClassLoader.loadClass(className,false); 第2个 boolean参数,表示目标对象是否进行链接,false表示不进行链接

3、数据库驱动使用Class.forName(className)是为了执行静态块代码

4. Class.forName(“pacage.A”).newInstance()与 new A()的效果是一样的。但是newInstance()只能调用无参数构造器,效率低下。

最新文章

  1. Provider Hosted App中使用JOM问题
  2. 利用WCF技术降低系统之间的耦合度
  3. 【BZOJ】1606: [Usaco2008 Dec]Hay For Sale(背包)
  4. 初学JavaScript(入门一)
  5. Dependency Injection学习笔记
  6. 在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world
  7. RocksDB介绍:一个比LevelDB更彪悍的引擎
  8. HDU_2046——骨牌铺放问题,递推
  9. [转]ActiveMQ 即时通讯服务 浅析
  10. openstack之horizon源码分析
  11. Quartz.NET 的任务调度管理工具
  12. a链接返回上一页
  13. rabbitmq之基本原理及搭建单机环境
  14. MySql共享锁和排它锁
  15. java基础系列--volatile关键字
  16. HDU 1007(套圈 最近点对距离)
  17. Codeforces Round #276 (Div. 1) E. Sign on Fence (二分答案 主席树 区间合并)
  18. 运行wmic命令异常:java.io.IOException: Cannot run program "wmic": CreateProcess error=2, ϵͳÕҲ»µ½ָ¶解决记录
  19. 【面向对象】用大白话扯扯那"神奇"的面向对象编程思维(二)
  20. java基础学习总结——线程(二)

热门文章

  1. 关于this的全面解析(call,apply,new)
  2. 毕向东_Java基础视频教程第20天_IO流(15~17)
  3. Azure 中部署Gitlab的方法
  4. 微信开发——微信公众平台实现消息接收以及消息的处理(Java版)
  5. Android开发精彩博文收藏——UI界面类
  6. 字典构造、合并(dict)、排序
  7. Python学习---Django下的Sql性能的测试
  8. ESS控制台发布新功能:创建多实例规格的伸缩配置
  9. Coursera 算法二 week 5 BurrowsWheeler
  10. Github的commit规范